有了前面兩篇的git操做學習教程: git場景操做學習教程(一) 和 git場景操做學習教程(二),這裏咱們再推出第三篇場景學習教程。html
本文同步發表在豆米的博客,若是喜歡,歡迎關注。git
你發現這個commit是錯的,想要撤回,那麼如何操做呢?bash
咱們將這種狀況分爲兩種:xss
git update-ref -d HEAD
git reset commit_id
git revert -m 1 commit-id
git branch -c feature/test
來新建一個分支git push
操做執行第二步的時候發現問題,feature/test
分支的upstream
不是origin/feature/test
,而是以前fork出來的分支master
,這是爲啥?怎麼修復這個問題?並且在push的時候報下面的這個提示:學習
而咱們指望的提示應該是這樣的:ui
fatal: The current branch feature/test1 has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin feature/test1
複製代碼
首先執行這個命令查看當前git的配置:git config --list
spa
關注紅圈圈的兩個配置,這倆配置就是致使問題的緣由3d
查看當前分支的關聯分支: git branch -vv
code
能夠看到新建的分支默認的關聯分支錯亂了。cdn
修改配置以下:
git config --global branch.autoSetupMerge true
git config --global push.default upstream
複製代碼
便可恢復到以前的提示狀態。那麼接下來講一下這倆配置吧。
該屬性決定了當執行git branch
或git checkout
的時候如何設置新分支以便執行git pull
的時候能夠恰當地和起始點分支進行合併。即便該選項沒有設置,該行爲也能夠在每一個分支上使用--track
和--no-track
進行設置。該配置有如下幾個可選值:false/true/always
false: 不會自動設置新分支
true: 當以一條遠程分支爲起始分支進行新建分支的時候,會自動設置新分支
always: 不管起始分支是本地的分支仍是遠程的分支,都會自動設置該新分支
複製代碼
怎麼解釋這些配置呢?舉個例子:
假設當前本地有master分支,遠程有master(origin/master)
分支和feature/B(origin/feature/B)
分支:
1. 當設置爲false的時候,不管新建的分支是否在遠端存在,都不會設置該分支的track,也就是你查看分支的upstream的時候是這樣的:
❯ git checkout feature/B
Switched to a new branch 'feature/B'
❯ git branch -vv
* feature/B 7255919 feat(B): 添加featureBB文件
master 1ab9353 [origin/master] fixssssss
複製代碼
從上圖打印能夠看出,雖然不會設置feature/B
,可是確實是以feature/B
這個遠端分支進行fork的。
2. 當設置爲true的時候,若是新建的分支在遠端存在,那麼自動設置該分支的upstream爲遠端分支,若是不存在,就不設置,以下:
❯ git checkout feature/B
Branch 'feature/B' set up to track remote branch 'feature/B' from 'origin'.
Switched to a new branch 'feature/B'
❯ git branch -vv
* feature/B 7255919 [origin/feature/B] feat(B): 添加featureBB文件
master 1ab9353 [origin/master] fixssssss
❯ git checkout -b feature/A
Switched to a new branch 'feature/A'
❯ git branch -vv
* feature/A 7255919 feat(B): 添加featureBB文件
feature/B 7255919 [origin/feature/B] feat(B): 添加featureBB文件
master 1ab9353 [origin/master] fixssssss
複製代碼
能夠看到切換到新分支的時候,若是新分支在遠端存在,那麼會自動track該分支的upstream爲遠端分支。
可是若是切換到的新分支遠端和本地都不存在,那麼該新分支不會自動設置
3. 當設置爲always的時候,以下:
❯ git checkout feature/B
Branch 'feature/B' set up to track remote branch 'feature/B' from 'origin'.
Switched to a new branch 'feature/B'
❯ git branch -vv
* feature/B 7255919 [origin/feature/B] feat(B): 添加featureBB文件
master 1ab9353 [origin/master] fixssssss
❯ gc -b feature/A
Branch 'feature/A' set up to track local branch 'master'.
Switched to a new branch 'feature/A'
❯ git branch -vv
* feature/A 1ab9353 [master] fixssssss
feature/B 7255919 [origin/feature/B] feat(B): 添加featureBB文件
master 1ab9353 [origin/master] fixssssss
❯ git branch feature/B
Branch 'feature/B' set up to track local branch 'master'.
❯ git branch -c feature/X
❯ git branch -vv
feature/B 1ab9353 [master] fixssssss
* feature/X 1ab9353 [origin/master] fixssssss
master 1ab9353 [origin/master] fixssssss
複製代碼
設置爲always的時候,若是新分支在遠端有的話,那麼自動track,若是沒有那就自動track到你當前所處的分支。因此你們能夠看到feature/B和feature/A的upstream分別是遠端的和本地的master。
另外使用git branch
的時候,也會這樣,由於等價於git checkout -b
。這裏有一個小小的知識點:
當使用git branch -c的時候,由於-c是copy的含義,因此feature/X是整個複製了master分支,因而連master的upstream都是複製過來的,因此這個時候feature/X的upstream是隨master同樣的,都是origin/master
最後,我的傾向的配置是true
,這樣提交代碼的時候不會亂設置upstream。
該屬性決定了git push
操做的默認行爲。 push.default
有如下幾個可選值: nothing, current, upstream, simple, matching
nothing: 直接push會出錯,須要顯式的指出推送的遠程分支,例如:git push origin <remote_branch>;
current: 推送時只會推送當前所在的分支到遠程同名分支,若是遠程分支不存在相應的同名分支,則建立該分支;
upstream: 推送當前分支到它的upstream分支上,這個模式只適用於推送到與拉取數據相同的倉庫(好比central workflow);
simple(默認): simple和upstream是類似的,只有一點不一樣,simple必須保證本地分支和它的遠程 upstream分支同名,不然會拒絕push操做。
matching:推送本地和遠程都存在的同名分支。
複製代碼
這個我的傾向的配置是upstream
,這樣push的時候都是push到本身本倉庫的遠端。