git場景操做學習教程(三)

有了前面兩篇的git操做學習教程: git場景操做學習教程(一)git場景操做學習教程(二),這裏咱們再推出第三篇場景學習教程html

本文同步發表在豆米的博客,若是喜歡,歡迎關注。git

一、場景一

1.一、預置條件

  1. repo是一個全新的倉庫或者已經有提交記錄的倉庫 二、你提交了一個commit了

1.二、問題

你發現這個commit是錯的,想要撤回,那麼如何操做呢?bash

1.三、操做步驟

咱們將這種狀況分爲兩種:xss

  1. 這是一個全新的分支,此時你的commit是第一個commit,那麼咱們應該使用這個命令: git update-ref -d HEAD
  2. 這是一個已經有過commit的分支,接下去咱們仍是要區分兩種狀況:
  3. 這個commit不是一個merge操做: git reset commit_id
  4. 這個commit是一個merge操做: git revert -m 1 commit-id

二、場景二

2.一、預置條件

  1. 在master分支上使用命令:git branch -c feature/test來新建一個分支
  2. 執行git push操做

2.二、問題

執行第二步的時候發現問題,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
複製代碼

2.三、緣由

首先執行這個命令查看當前git的配置:git config --listspa

關注紅圈圈的兩個配置,這倆配置就是致使問題的緣由3d

查看當前分支的關聯分支: git branch -vvcode

能夠看到新建的分支默認的關聯分支錯亂了。cdn

2.四、解決以及原理

修改配置以下:

git config --global branch.autoSetupMerge true
git config --global push.default upstream
複製代碼

便可恢復到以前的提示狀態。那麼接下來講一下這倆配置吧。

2.4.一、branch.autoSetupMerge

該屬性決定了當執行git branchgit 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。

2.4.二、push.default

該屬性決定了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到本身本倉庫的遠端。

參考

  1. git config
  2. git branch
相關文章
相關標籤/搜索