2013-05-31 243 views
13

我通常使用git pull --rebase如果我直接在master上工作(我儘量不去做)。如果我忘記進行重新署名並且只是做了git pull,是否有辦法撤消這個並使之成爲線性的,而不是合併?在這一點上做一個rebase是一個壞主意(如果這甚至可以完成任何事情)?git rebase after pull

我知道我可以把默認啓用重新綁定拉,所以我不會忘記,但這是更多的理解在這種情況下做什麼的問題。

+3

我想'git的前拉回到復位--hard'到重做拉就是這樣。 – Alex

+0

謝謝。你能否將其作爲回答而不是評論發佈? –

回答

3

我猜git reset --hard回拉前和重做拉的方式是

14

簡短回答(@Alex在評論中已給出):git reset --hard HEAD^,但僅當合並提交(否則您只是備份您的快進中的一個提交)。

龍版採用的解釋:

git pull實際上只是git fetch其次是git merge(除非你有--rebase覆蓋,爲你注)。所以,你只需要看到,如果你有一個實際的合併提交與否:

$ git pull 
Updating 171ce6f..523bacb 
Fast-forward 
mp.py | 24 ++++++++++++++++++++++++ 
1 files changed, 24 insertions(+), 0 deletions(-) 
create mode 100644 mp.py 

在這種情況下,沒有合併提交,只是一個快進,所以,沒有問題,有沒有改變衍合!如果你做了一個git log,你會看到缺乏合併提交,特別是如果你做了下面的圖表。

讓我們強制合併。

$ git reset --hard HEAD^ 
HEAD is now at 171ce6f ignore *.log files 

[現在我一個落後remotes/origin/master]

$ echo '# pointless comment' >> selfref.py 
$ git add selfref.py 
$ git commit -m 'added to force merge' 
[master 260e129] added to force merge 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ git pull 
Merge made by recursive. 
mp.py | 24 ++++++++++++++++++++++++ 
1 files changed, 24 insertions(+), 0 deletions(-) 
create mode 100644 mp.py 

我們可以看到這種情況發生,即使上面的文字丟失,有:

$ git log --graph --decorate --abbrev-commit --pretty=oneline 
* c261bad (HEAD, master) Merge branch 'master' of [ssh url] 
|\ 
| * 523bacb (origin/master, origin/HEAD) add multiprocessing example 
* | 260e129 added to force merge 
|/ 
* 171ce6f ignore *.log files 

我們要請將本地分行名稱master再次指向(在本例中)260e129。好在這是很容易的名字:

$ git rev-parse HEAD^ 
260e1297900b903404c32f3706b0e3139c043ce0 

(目前,雙親的另一方,合併犯是HEAD^2)。所以:

$ git reset --hard HEAD^ 
HEAD is now at 260e129 added to force merge 

,現在我們可以變基到remotes/origin/master(我「會用非常短的名稱,origin,來命名):

$ git rebase origin 
First, rewinding head to replay your work on top of it... 
Applying: added to force merge 

現在圖-Y單行日誌顯示:

$ git log --graph --decorate --abbrev-commit --pretty=oneline 
* 4a0b2e2 (HEAD, master) added to force merge 
* 523bacb (origin/master, origin/HEAD) add multiprocessing example 
* 171ce6f ignore *.log files 

從這一切,你應該能夠找出如果你運行git pull該怎麼辦,它抱怨合併失敗。 :-)

0

我想給你一些建議,這有助於保持歷史線性。設置以下git配置,以便在進行pull操作時自動重新綁定分支。

$ git config branch.autosetuprebase always 

應用此設置,不需要輸入與--rebase參數,只是git pull完全拉出指令後。

更多信息,您可以在這篇文章中得到 http://stevenharman.net/git-pull-with-automatic-rebase

+0

正如我的問題所述,我知道我可以做到這一點。我只是想學習在這種情況下做什麼。 –

相關問題