天天看點

常用git指令總結大全

目錄

一、常用指令

1、git init

2、git add 檔案名

3、git commit -m “備注”

4、git status 與 git diff

5、git show commit_id  檢視某次修改

6、git log 與 git reflow

7、git pull (--rebase)

8、git push (-u) 與 git branch (-u)

9、git reset --hard 與 git cherry-pick

10、git checkout與git 分支

11、git help 與 git gui

二、撤銷修改

1、撤銷工作區修改(尚未add,尚未commit)

2、撤銷暫存區修改(已經add,尚未commit)

3、撤銷版本庫修改(已經commit,尚未推送到遠端)

4、版本回退

三、删除檔案

四、遠端倉庫

1、連上遠端庫

2、本地向遠端推送内容

3、遠端庫的所有内容推送到本地庫上

五、分支管理

1、基礎指令

2、解決沖突

3、分制管理政策(禁掉快進模式)

4、BUG分支

5、Feature分支

6、多人協作

六、忽略上傳

1、忽略上傳

2、忽略更新上傳

七、檔案對比

八、高頻操作

1、分支建立

(1)用某個commit建立分支:git checkout -b 分支名 commit_id

(2)用遠端分支建立分支:git fetch origin 遠端分支名:本地分支名

2、更改commit的備注

(1)隻想修改最後一次注釋: git commit --amend

(2)修改之前的注釋

(2.1)git rebase -i HEAD~10 

(2.2)想修改的那條注釋前的 pick換成edit

(2.3)git commit --amend

(2.4)git rebase --continue

3、版本回退

(1)回退到B,CD不要了,===>版本回退:git reset --hard B

(2)撤銷B的送出,其餘保留, ===>版本撤銷:git revert B

(3)取消對b送出的撤銷,B重新回來, ===>git cherry-pick B

4、IDE對比不同分支的

一、常用指令

常用git指令總結大全

1、git init

2、git add 檔案名

3、git commit -m “備注”

常用git指令總結大全

4、git status 與 git diff

git status 告訴你有檔案被修改過
git diff 檢視修改内容

git diff common/ > 1.diff   将common目錄下的改動轉存為1.diff

git diff 工作區(work dict)和暫存區(stage)的比較
git diff —cache 暫存區(stage)與分支(master)的比較

5、git show commit_id  檢視某次修改

6、git log 與 git reflow

git log或者git log —pretty=oneline或者git log —graph —pretty=oneline —abbrev-commit

用git log --graph指令可以看到分支合并圖

git --no-pager log -3 -p 檢視最近3個版本的修改情況

--no-pager  不less分頁顯示了

-3修改3個版本

-p顯示修改部分 

當多人協作開發一個分支時,git log --graph --pretty=oneline --abbrev-commit

檢視曆史記錄通常如下方左圖所示,比較淩亂。如果希望能像右圖那樣呈線性送出,就需要學習git rebase的用法。

git log 檢視送出曆史,看要回退到哪個版本
git reflow 檢視指令曆史,看要回退到哪個版本

7、git pull (--rebase)

git pull時可以加上--rebase參數, 使之不産生Merge點, 保證了代碼的整潔,

git pull –rebase

再次git log --graph--pretty=oneline --abbrev-commit,新的merge就會呈現右圖的線性樣式。

但每次都加--rebase似乎有些麻煩,我們可以指定某個分支在執行git pull時預設采用rebase方式:

git config branch.dev.rebase true  #dev修改成本地的分支名字

如果你覺得所有的分支都應該用rebase,那就設定:

git config --global branch.autosetuprebase always

這樣對于建立的分支都會設定上面的rebase=true了。已經建立好的分支還是需要手動配置的。

=================================================================================

8、git push (-u) 與 git branch (-u)

(1)git push -u 與 git push -u的差別?

git push -u origin dev = git push origin/dev dev + git branch -u origin/dev dev 

(2)git push -u origin 與 git branch -u origin的差別?

git push origin不指定遠端分支,則預設的遠端分支與本地分支一樣

git branch origin不指定遠端分支,則預設的遠端分支=master

舉例如下:

git push origin dev = git push origin/dev dev

git branch origin dev = git branch origin/master dev

常用git指令總結大全
常用git指令總結大全
常用git指令總結大全
常用git指令總結大全

綜上,無論push還是branch,-u指定遠端分支與本地分支的關聯關系時,最好指定遠端分支名:origin/遠端分支名。然後像push報錯,再報遠端分支名去掉。

9、git reset --hard 與 git cherry-pick

git reset —hard HEAD/HEAD^/HEAD^^/HEAD~100   回退到上幾個版本

HEAD是目前版本,HEAD^上個版本,HEAD^^上上個版本,HEAD~100回退100個版本

git reset —hard 3628164 回退到指定版本号,版本号不用寫全

git reset --hard  回退代碼。回退到某個commit_id
git cherry-pick 摘草莓。摘取某個commit_id到目前分支下(隻要這個commit_id存在就好,不在乎它在哪個分支下的)

場景1:代碼回退

dev分支修改,送出3次commit,然後合并到master,結果線上報錯,吓得我直接revert這段合并,但是後來麻煩就來了。本來想着在現有基礎上修複,又送出了一次commit送出,但是發現前3次的commit沒了,想哭,原來是真的版本後退了,這3個commit消失得無影無蹤。咋辦?在本地dev分支下git log:見有圖。

解決方案:

git reset --hard 630391de81dba0a7e47e2ce2a0d10766460d706e

git cherry-pick 31f91471a801ec9fc5d49e84cefccc5942c190a6

git push origin dev  --force #必須強推,如果受保護的分支,先不保護,強推後再保護

常用git指令總結大全

場景2:一個分支摘取另一個分支的某個commit送出

10、git checkout與git 分支

git checkout 

(1)在本地目前分支的基礎上,建立一個新分支

git checkout -b 分支名

(2)拉取遠端分支去建立本地分支

git checkout -b 本地分支名 origin/遠端分支名

git分支

(1)檢視所有本地分支:git branch

         檢視所有遠端分支:git branch -r

         檢視所有本地和遠端分支:git branch -a

(2)用某個commit建立分支:git checkout -b 分支名 某次commit_id

(3)用遠端分支建立分支:git fetch origin 遠端分支名:本地分支名,然後,git checkout 本地分支名

11、git help 與 git gui

git help是個可以檢視所有git指令的手冊,比如要查詢 git branch相關參數,執行git help branch,然後OPTIONS字段就能看到所有git branch的所有參數及其解釋。比如想看git branch -u的用法

常用git指令總結大全

git gui是git的圖形操作界面

二、撤銷修改

1、撤銷工作區修改(尚未add,尚未commit)

——   git checkout -- readme.txt

2、撤銷暫存區修改(已經add,尚未commit)

———   git reset HEAD readme.txt, 再git checkout -- readme.txt

git reset指令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。

3、撤銷版本庫修改(已經commit,尚未推送到遠端)

———  git reset —hard HEAD^(版本回退)

常用git指令總結大全

4、版本回退

(4.1)删除分支

删除本地分支: git branch -D br

删除遠端分支: git push origin :br  (origin 後面有空格)

(4.2)代碼復原

git代碼庫復原: 指的是将代碼庫某分支退回到以前的某個commit id

【本地代碼庫復原】:

git reset --hard commit-id :復原到commit-id,講commit-id之後送出的commit都去除

git reset --hard HEAD~3:将最近3次的送出復原(HEAD~3可以改寫成HEAD^^^)

【遠端代碼庫復原】:

這個是重點要說的内容,過程比本地復原要複雜

應用場景:自動部署系統釋出後發現問題,需要復原到某一個commit,再重新釋出

原理:先将本地分支退回到某個commit,删除遠端分支,再重新push本地分支

操作步驟:

1、git checkout the_branch

2、git pull

3、git branch the_branch_backup //備份一下這個分支目前的情況

4、git reset --hard the_commit_id //把the_branch本地復原到the_commit_id

5、git push origin :the_branch //删除遠端 the_branch

6、git push origin the_branch //用復原後的本地分支重建立立遠端分支

7、git push origin :the_branch_backup //如果前面都成功了,删除這個備份分支

如果使用了gerrit做遠端代碼中心庫和code review平台,需要確定操作git的使用者具備分支的push權限,并且選擇了 Force Push選項(在push權限設定裡有這個選項)

另外,gerrit中心庫是個bare庫,将HEAD預設指向了master,是以master分支是不能進行删除操作的,最好不要選擇删除master分支的政策,換用其他分支。如果一定要這樣做,可以考慮到gerrit伺服器上修改HEAD指針。。。不建議這樣搞

【遠端代碼庫master分支復原】

在強推mster的可能會報錯沒有權限:You don't have permission

是因為master分支一般會成為保護分支,是以我們首先要去除master為保護分支,才可以強推。

####PS: 為分支開啟保護########

*管理者可以開啟

* 開啟,無法強制推送

* 開啟,無法被删除

* 隻有測試全部通過才被接受合并

###########################

是以步驟如上,部分改動如下:

隻不過第4,5步中間加上去除master為保護分支,

第6步強推:push -u origin master -f

最後當恢複完成,要把master分支重新設為受保護分支

【标簽和分支的對比】

    标簽 分支
建立 git tag tagname (commit_id) git checkout -b branchname
git tag -a tagname -m "标簽詳情" (commit_id)
檢視 看目前 git show tagname
看全部 git tag git branch
推遠端 git push origin tagname git push origin branchname
删除 删本地 git tag -d tagname git branch -D branchname
删遠端 git push origin :refs/tags/tagname git push origin :branchname

三、删除檔案

git add test.txt,  git commit -m "add test.txt" 

rm test.txt  從工作區删除該檔案

git rm test.txt,git commit -m "remove test.txt" 從版本庫中删除該檔案,并送出

假設工作區開始就删錯了,可以用版本庫的覆寫工作區的

git checkout -- test.txt

四、遠端倉庫

1、連上遠端庫

git remote add origin [email protected]:wuhuaguo2/learngit.git  

2、本地向遠端推送内容

git push  -u origin master 第一次把本地庫的master分支所有内容推送到遠端庫的master分支上
git push  origin master 非第一次把本地庫的master分支所有内容推送到遠端庫的master分支上
git push  origin dev  非第一次把本地庫的dev分支所有内容推送到遠端庫的master分支上
遠端庫的名字就是origin

3、遠端庫的所有内容推送到本地庫上

git clone [email protected]:wuhuaguo2/gitskills.git  (第一次)

or:git clone http://github.com/wuhuaguo2/gitskills,但是接下來得輸入賬号密碼

如果想拉指定分支如dev,先在本地:git checkout -b dev

然後,git clone -b dev [email protected]:wuhuaguo2/gitskills.git

or: git clone -b dev http://github.com/wuhuaguo2/gitskills

第二次及以上

git pull指令用于從另一個存儲庫或本地分支擷取并內建(整合)。

git pull指令的作用是:取回遠端主機某個分支的更新,再與本地的指定分支合并。 

git pull = git fetch + git merge

如果gitlab上a送出了,b又送出了,現在a在本地修改了代碼,準備送出

git add .

git commit -m “a second tijiao” 

git push origin master

此時肯定送出不上去,需要先pull下來(pull=fetch取遠端+merge遠端與本地合并)

git pull origin master

如果此時出現merge conflict,去解決沖突,然後git add . git commit -m“conflict resolved”

git push origin master

能push上去 不能push上去

git add .

git commit -m “a second tijiao” 

git push origin master

git add .

git commit -m “a second tijiao” 

git pull origin master

git push origin master

五、分支管理

1、基礎指令

檢視分支:git branch

建立分支:git branch 分支名

切換分支:git checkout 分支名

建立+切換分支:git checkout -b 分支名

合并某分支到目前分支:git merge 分支名

删除分支:git branch -d 分支名

删除未被合并的分支:git branch -D 分支名

//建立分支并上傳線上
git checkout -b xf
git add routes/web.php
git commit -m “test”
git push origin xf

//檢視分支,并pull下來
git fetch —all
git pull origin xf 
           

2、解決沖突

feature分支和master分支各自修改readme.txt,在git merge feature提示沖突了

1、git status看到2個分支對readme.txt的送出沖突了

或者  cat readme.txt會看到<<<,===,>>>标記出不同分支的沖突内容 

2、修改沖突,add, commit

3、git log --graph --pretty=oneline --abbrev-commit檢視分支合并情況

4、删除feature分支: git branch -d feature1

舉例子:例1:

現有分支dev,建立一個分支xf,xf的原始内容和dev一樣,盡情玩xf

git checkout -b xf

git merge dev

常用git指令總結大全

例2:

git checkout -b xf1 origin/dev

⚠️危險操作,将本地xf1分支和線上dev分支關聯起來。一般而言,本地分支和線上分支名字保持一緻。

3、分制管理政策(禁掉快進模式)

合并分支時,如果可能,Git會用Fast forward(快進)模式,但這種模式下,删除分支後,會丢掉分支資訊。如果要用--no-ff強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支曆史上就可以看出分支資訊。

1、在dev分支上add, merge

2、切到master分支

3、用—no-ff來merge: git merge--no-ff -m "merge with no-ff" dev

因為本次合并要建立一個新的commit,是以加上-m參數,把commit描述寫進去。

4、git log --graph --pretty=oneline --abbrev-commit檢視分支合并情況

使用和禁用快進模式對比

常用git指令總結大全

禁掉快進模式後:

常用git指令總結大全

4、BUG分支

在dev分支下開發,突然接到任務:去master下修複一個代号=102的bug,但此時dev上add了但未commit,咋辦?

1、用stash可以把目前工作現場“儲藏”起來: git stash

2、切到master分支,從master建立臨時分支issue-101,修複bug

git checkout master

git checkout -b issue-101

vim readme.txt

git add readme.txt 

git commit -m "fix bug 101"

修複完成後,切換到master分支,并完成合并,最後删除issue-101分支

git checkout master

git merge --no-ff -m "merged bug fix 101" issue-101

git branch -d issue-101

3、回到dev分支、恢複工作區,繼續開發

git checkout dev

git status顯示工作區是幹淨的,因為存在stash裡面  git stash list檢視儲藏清單  

從儲藏恢複到工作區,兩種方式:

用git stash apply恢複工作區,再用git stash drop來删除stash
用git stash pop,恢複的同時把stash内容也删了

git stash list:    再次檢視,就看不到任何stash内容了

5、Feature分支

開發一個新的feature,最好建立一個分支。

删除未被合并的分支:git branch -D 分支名

6、多人協作

git remote   檢視遠端庫的資訊,預設為origin

git remote -v     顯示更詳細的資訊  

  • 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠端的新送出;
  • 在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠端分支的名稱最好一緻;
  • 建立本地分支和遠端分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
  • 從遠端抓取分支,使用git pull,如果有沖突,要先處理沖突。

六、忽略上傳

git忽略對已入庫檔案的修改(https://my.oschina.net/zlLeaf/blog/197740) 

1、忽略上傳

.gitignore 或者excludes 隻針對尚未送出到配置庫的檔案才起作用。而對于已經送出的檔案是不起作用的。

由此可見,這兩個檔案的初衷是用于排除不希望上傳入庫的檔案。像編譯産生的臨時檔案等。

2、忽略更新上傳

有個檔案,我們必須入庫,大家一起共享,但是每個人本地的配置又是因自己本地的環境而異。想後續不再更新給檔案的修改,使用下面的指令:

git update-index --assume-unchanged FILENAME

這樣,每個人,從庫上取代碼後,在自己本地都要執行一下上面的這個指令。這樣,以後,你這個檔案的修改,git 都會幫你忽略掉。

當然,哪一天,你希望你的修改要送出入庫,那你也必須手動修改一下 這個檔案的标志位:

git update-index --no-assume-unchanged FILENAME

七、檔案對比

git對比2個版本某個檔案的差異

git diff                                          //檢視尚未暫存的檔案更新了哪些部分

git diff filename                      //檢視尚未暫存的某個檔案更新了哪些

git diff –cached                              //檢視已經暫存起來的檔案和上次送出的版本之間的差異

git diff –cached filename                   //檢視已經暫存起來的某個檔案和上次送出的版本之間的差異

git diff commit_id1 commit_id2                    //檢視某兩個版本之間的差異

git diff commit_id1 commit_id2 具體檔案路徑  //檢視某兩個版本的某個檔案之間的差異,紅色部分是commit_id1,綠色部分是commit_id2

(或者: git diff commit_id1:具體檔案路徑 commit_id2:具體檔案路徑)

git對比2個分支某個檔案的差異

git diff branch1 branch2 --stat       //顯示出所有有差異的檔案清單

git diff branch1 branch2              //顯示出所有有差異的檔案的詳細差異

git diff branch1 branch2 具體檔案路徑   //顯示指定檔案的詳細差異,紅色部分是commit_id1,綠色部分是commit_id2

(或者: git diff branch1:具體檔案路徑 branch2:具體檔案路徑)

八、高頻操作

1、分支建立

(1)用某個commit建立分支:git checkout -b 分支名 commit_id

(2)用遠端分支建立分支:git fetch origin 遠端分支名:本地分支名

用遠端分支建立分支:git fetch origin 遠端分支名:本地分支名,然後,git checkout 本地分支名

2、更改commit的備注 

詳見:Git 修改已送出的commit注釋 - 簡書

(1)隻想修改最後一次注釋: git commit --amend

出現有注釋的界面(你的注釋應該顯示在第一行), 輸入i進入修改模式,修改好注釋後,按Esc鍵 退出編輯模式,輸入:wq儲存并退出。ok,修改完成。

(2)修改之前的注釋

(2.1)git rebase -i HEAD~10 

(2.2)想修改的那條注釋前的 pick換成edit

(2.3)git commit --amend

(2.4)git rebase --continue

3、版本回退

比如commit送出最新到最舊為: D C B A 

(1)回退到B,CD不要了,===>版本回退:git reset --hard B

(2)撤銷B的送出,其餘保留, ===>版本撤銷:git revert B

(3)取消對b送出的撤銷,B重新回來, ===>git cherry-pick B

4、IDE上不同分支代碼對比

常用git指令總結大全

--->全選,選擇差異----> 

常用git指令總結大全

—————————————————————————————————————————————————

其它詳見: 

Git教程 - 廖雪峰的官方網站 

Git - git-archive Documentation git 官方手冊

10 個很有用的進階 Git 指令 - 技術翻譯 - OSCHINA 社群 10個很有用的進階Git指令

git 删除本地分支和遠端分支、本地代碼復原和遠端代碼庫復原 - PianoCoder - 部落格園 git删除本地分支和遠端分支、本地代碼復原和遠端代碼庫復原