我通常使用git pull --rebase
如果我直接在master上工作(我儘量不去做)。如果我忘記進行重新署名並且只是做了git pull
,是否有辦法撤消這個並使之成爲線性的,而不是合併?在這一點上做一個rebase是一個壞主意(如果這甚至可以完成任何事情)?git rebase after pull
我知道我可以把默認啓用重新綁定拉,所以我不會忘記,但這是更多的理解在這種情況下做什麼的問題。
我通常使用git pull --rebase
如果我直接在master上工作(我儘量不去做)。如果我忘記進行重新署名並且只是做了git pull
,是否有辦法撤消這個並使之成爲線性的,而不是合併?在這一點上做一個rebase是一個壞主意(如果這甚至可以完成任何事情)?git rebase after pull
我知道我可以把默認啓用重新綁定拉,所以我不會忘記,但這是更多的理解在這種情況下做什麼的問題。
我猜git reset --hard
回拉前和重做拉的方式是
簡短回答(@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
該怎麼辦,它抱怨合併失敗。 :-)
我想給你一些建議,這有助於保持歷史線性。設置以下git配置,以便在進行pull操作時自動重新綁定分支。
$ git config branch.autosetuprebase always
應用此設置,不需要輸入與--rebase
參數,只是git pull
完全拉出指令後。
更多信息,您可以在這篇文章中得到 http://stevenharman.net/git-pull-with-automatic-rebase
正如我的問題所述,我知道我可以做到這一點。我只是想學習在這種情況下做什麼。 –
我想'git的前拉回到復位--hard'到重做拉就是這樣。 – Alex
謝謝。你能否將其作爲回答而不是評論發佈? –