日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

git 學習筆記

 印度阿三17 2019-04-21

1. 前言

  首先上一張別人整理好的圖:

?

?2. git 介紹

  git 是分布式版本控制系統(tǒng)

  集中式 vs 分布式 (SVN vs GIT)

?    SVN和 Git 主要的區(qū)別在于歷史版本維護的位置,SVN 在中央服務器,而 git 歷史版本存在于每個本地倉庫

    Git本地倉庫包含代碼庫還有歷史庫,在本地的環(huán)境開發(fā)就可以記錄歷史而SVN的歷史庫存在于中央倉庫,每次對比與提交代碼都必須連接到中央倉庫才能進行

    這樣的好處在于:

      自己可以在脫機環(huán)境查看開發(fā)的版本歷史

      多人開發(fā)時如果充當中央倉庫的Git倉庫掛了,可以隨時創(chuàng)建一個新的中央倉庫然后同步就立刻恢復了中央庫

    

?3. Git 命令

?

3.1 git 配置

?

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

?

?git config命令的--global參數(shù),表明這臺機器上的所有Git倉庫都會使用這個配置,也可以對某個倉庫指定不同的用戶名和郵箱地址。

?

3.2 創(chuàng)建版本庫

?

初始化一個git倉庫

$ git init

?

?

添加文件到git倉庫

包括兩步:

$ git add <file>
$ git commit -m "description"

?

git add可以反復多次使用,添加多個文件,git commit可以一次提交很多文件,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容。

?

3.3 查看工作區(qū)狀態(tài)

$ git status

?

?

3.4 查看修改內(nèi)容

$ git diff
$ git diff --cached
$ git diff HEAD -- <file>

?

?

  • git diff 可以查看工作區(qū)(work dict)和暫存區(qū)(stage)的區(qū)別
  • git diff --cached 可以查看暫存區(qū)(stage)和分支(master)的區(qū)別
  • git diff HEAD -- <file> 可以查看工作區(qū)和版本庫里面最新版本的區(qū)別

?

3.5 查看提交日志

$ git log

?

簡化日志輸出信息

$ git log --pretty=oneline

?

?

?3.6 查看命令歷史

$ git reflog

?

?

3.7 版本回退

$ git reset --hard HEAD^

以上命令是返回上一個版本,在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本是HEAD^^,往上100個版本寫成HEAD~100。

回退到指定版本

$ git reset --hard commit_id

?

commit_id是版本號,是一個用SHA1計算出的序列

?

工作區(qū)、暫存區(qū)和版本庫

工作區(qū):在電腦里能看到的目錄; 版本庫:在工作區(qū)有一個隱藏目錄.git,是Git的版本庫。 Git的版本庫中存了很多東西,其中最重要的就是稱為stage(或者稱為index)的暫存區(qū),還有Git自動創(chuàng)建的master,以及指向master的指針HEAD。

?

?

進一步解釋一些命令:

  • git add實際上是把文件添加到暫存區(qū)
  • git commit實際上是把暫存區(qū)的所有內(nèi)容提交到當前分支

?

3.8 撤銷修改

丟棄工作區(qū)的修改

$ git checkout -- <file>

該命令是指將文件在工作區(qū)的修改全部撤銷,這里有兩種情況:

  1. 一種是file自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);
  2. 一種是file已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)。

?

?丟棄暫存區(qū)的修改

?分兩步: 第一步,把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū):

$ git reset HEAD <file>

?

第二步,撤銷工作區(qū)的修改

$ git checkout -- <file>

?

?

小結:

  1. 當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- <file>。

  2. 當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了第一步,第二步按第一步操作。

  3. 已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,進行版本回退,前提是沒有推送到遠程庫。

?

?3.9 刪除文件

$ git rm <file>

?

?git rm <file>相當于執(zhí)行

$ rm <file>
$ git add <file>

?

?

進一步的解釋

Q:比如執(zhí)行了rm text.txt 誤刪了怎么恢復? A:執(zhí)行git checkout -- text.txt 把版本庫的東西重新寫回工作區(qū)就行了

Q:如果執(zhí)行了git rm text.txt我們會發(fā)現(xiàn)工作區(qū)的text.txt也刪除了,怎么恢復? A:先撤銷暫存區(qū)修改,重新放回工作區(qū),然后再從版本庫寫回到工作區(qū)

$ git reset head text.txt
$ git checkout -- text.txt

?

Q:如果真的想從版本庫里面刪除文件怎么做? A:執(zhí)行git commit -m "delete text.txt",提交后最新的版本庫將不包含這個文件

?

遠程倉庫

創(chuàng)建SSH Key

$ ssh-keygen -t rsa -C "youremail@example.com"

?

關聯(lián)遠程倉庫

$ git remote add origin https://github.com/username/repositoryname.git

推送到遠程倉庫

$ git push -u origin master

?

?-u 表示第一次推送master分支的所有內(nèi)容,此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

?

從遠程克隆

$ git clone https://github.com/usern/repositoryname.git

?

?

分支

創(chuàng)建分支

$ git branch <branchname>

?

?

查看分支

$ git branch

git branch命令會列出所有分支,當前分支前面會標一個*號。

?

切換分支

$ git checkout <branchname>

?

?

創(chuàng)建 切換分支

$ git checkout -b <branchname>

?

?

合并某分支到當前分支

$ git merge <branchname>

?

?

刪除分支

$ git branch -d <branchname>

?

查看分支合并圖

$ git log --graph

?

當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。用git log --graph命令可以看到分支合并圖。

?

普通模式合并分支

$ git merge --no-ff -m "description" <branchname>

?

因為本次合并要創(chuàng)建一個新的commit,所以加上-m參數(shù),把commit描述寫進去。合并分支時,加上--no-ff參數(shù)就可以用普通模式合并,能看出來曾經(jīng)做過合并,包含作者和時間戳等信息,而fast forward合并就看不出來曾經(jīng)做過合并。

?

保存工作現(xiàn)場

$ git stash

?

?

查看工作現(xiàn)場

$ git stash list

?

?

恢復工作現(xiàn)場

$ git stash pop

?

?

丟棄一個沒有合并過的分支

$ git branch -D <branchname>

查看遠程庫信息

$ git remote -v

?

?

在本地創(chuàng)建和遠程分支對應的分支

$ git checkout -b branch-name origin/branch-name

?

本地和遠程分支的名稱最好一致;

?

從本地推送分支

$ git push origin branch-name

?

如果推送失敗,先用git pull抓取遠程的新提交;

?

從遠程抓取分支

$ git pull

如果有沖突,要先處理沖突。

?

標簽

tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。

新建一個標簽

$ git tag <tagname>

命令git tag <tagname>用于新建一個標簽,默認為HEAD,也可以指定一個commit id。

?

指定標簽信息

$ git tag -a <tagname> -m <description> <branchname> or commit_id

?

git tag -a <tagname> -m "blablabla..."可以指定標簽信息。

?

PGP簽名標簽

$ git tag -s <tagname> -m <description> <branchname> or commit_id

git tag -s <tagname> -m "blablabla..."可以用PGP簽名標簽。

?

查看所有標簽

$ git tag

?

?

推送一個本地標簽

$ git push origin <tagname>

?

?

推送全部未推送過的本地標簽

$ git push origin --tags

?

?

刪除一個本地標簽

$ git tag -d <tagname>

?

?

刪除一個遠程標簽

$ git push origin :refs/tags/<tagname>

?

?

rebase

1. 合并多個commit為一個完整commit

當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明了,我們希望把如下分支B、C、D三個提交記錄合并為一個完整的提交,然后再push到公共倉庫。

現(xiàn)在我們在測試分支上添加了四次提交,我們的目標是把最后三個提交合并為一個提交:

?

?

也就是把 add b.py / add c.py / add d.py 合并為一個提交

這里我們使用命令:

git rebase -i  [startpoint]  [endpoint]
其中-i的意思是--interactive,即彈出交互式的界面讓用戶編輯完成合并操作,[startpoint] [endpoint]則指定了一個編輯區(qū)間,如果不指定[endpoint],則該區(qū)間的終點默認是當前分支HEAD所指向的commit(注:該區(qū)間指定的是一個前開后閉的區(qū)間)。
在查看到了log日志后,我們運行以下命令:
git rebase -i 32d82b5

?然后我們會看到如下界面:

?

?上面未被注釋的部分列出的是我們本次rebase操作包含的所有提交,下面注釋部分是git為我們提供的命令說明。每一個commit id 前面的pick表示指令類型,git 為我們提供了以下幾個命令:

    pick:保留該commit(縮寫:p)
    reword:保留該commit,但我需要修改該commit的注釋(縮寫:r)
    edit:保留該commit, 但我要停下來修改該提交(不僅僅修改注釋)(縮寫:e)
    squash:將該commit和前一個commit合并(縮寫:s)
    fixup:將該commit和前一個commit合并,但我不要保留該提交的注釋信息(縮寫:f)
    exec:執(zhí)行shell命令(縮寫:x)
    drop:我要丟棄該commit(縮寫:d)

?

?

根據(jù)我們的需求,我們將commit內(nèi)容編輯如下:

?

保存退出,然后是注釋修改界面

?

注釋內(nèi)容根據(jù)需要進行修改,也可以不修改,直接保存退出

查看log記錄信息:

?

?

2. 將某一段commit粘貼到另一個分支上

當我們項目中存在多個分支,有時候我們需要將某一個分支中的一段提交同時應用到其他分支中,就像下圖:

我們希望將develop分支中的C~E部分復制到master分支中,這時我們就可以通過rebase命令來實現(xiàn)(如果只是復制某一兩個提交到其他分支,建議使用更簡單的命令:git cherry-pick)。

?在實際模擬中,我們創(chuàng)建了master和develop兩個分支:

?

master 分支

?

develop 分支

?

?

我們使用命令的形式為:

git rebase   [startpoint]   [endpoint]  --onto  [branchName]

?

?

其中,[startpoint] [endpoint]仍然和上一個命令一樣指定了一個編輯區(qū)間(前開后閉),--onto的意思是要將該指定的提交復制到哪個分支上。
所以,在找到C(41f40e4)和E(9c1423c)的提交id后,我們運行以下命令:

git  rebase   41f40e4^   9c1423c   --onto master

?

?注:因為[startpoint] [endpoint]指定的是一個前開后閉的區(qū)間,為了讓這個區(qū)間包含C提交,我們將區(qū)間起始點向后退了一步。


運行完成后查看當前分支的日志:

?

?可以看到,C~E部分的提交內(nèi)容已經(jīng)復制到了G的后面了,大功告成?NO!我們看一下當前分支的狀態(tài):

?

當前HEAD處于游離狀態(tài),實際上,此時所有分支的狀態(tài)應該是這樣:

所以,雖然此時HEAD所指向的內(nèi)容正是我們所需要的,但是master分支是沒有任何變化的,git只是將C~E部分的提交內(nèi)容復制一份粘貼到了master所指向的提交后面,我們需要做的就是將master所指向的提交id設置為當前HEAD所指向的提交id就可以了,即:

?

?

此時就真正完成了粘貼到master分支。

?

自定義 git

git 提示顯示顏色

$ git config --global color.ui true

?

?

忽視特殊文件

在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore文件,然后把要忽略的文件名填進去,Git就會自動忽略這些文件。

具體參考:https://github.com/github/gitignore

?

配置別名

$ git config --global alias.st status

?

上面配置別名是將 status 定義別名為 st ,這里和linux中 alias 定義別名的概念是一致的。

?

配置Git的時候,加上--global是針對當前用戶起作用的,如果不加,那只針對當前的倉庫起作用。

配置文件在 ~/.gitconfig 文件中

[root@localhost ~]# cat .gitconfig 
[user]
    name = username
    email = email
[color]
    ui = true
[alias]
    st = status
    ci = commit
    br = branch
    ck = checkout
    unstage = reset HEAD
    last = log -1
    lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

?

參考鏈接:

  https://www./wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  https://github.com/hongiii/gitNotes_from_Liao/blob/master/gitNotes_from_Liao.md#工作區(qū)暫存區(qū)和版本?%9

  https://www.jianshu.com/p/4a8f4af4e803

?

來源:http://www./content-4-169701.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多