目錄
一、常用指令
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對比不同分支的
一、常用指令
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TP3JWMkdVWxg2VkNTOWRmbGdFZvZ1MkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TOyATM0gjMxADNxEDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1、git init
2、git add 檔案名
3、git commit -m “備注”
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
| |
| |
綜上,無論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 #必須強推,如果受保護的分支,先不保護,強推後再保護 | |
場景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 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^(版本回退)
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
例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檢視分支合并情況
使用和禁用快進模式對比
禁掉快進模式後:
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-archive Documentation git 官方手冊
10 個很有用的進階 Git 指令 - 技術翻譯 - OSCHINA 社群 10個很有用的進階Git指令
git 删除本地分支和遠端分支、本地代碼復原和遠端代碼庫復原 - PianoCoder - 部落格園 git删除本地分支和遠端分支、本地代碼復原和遠端代碼庫復原