爲了補充託雷克的出色答卷:
的力推動可能會導致以後合併問題。
問題:
如果強制推送一個分支,你是從該分支刪除一些現有的提交(否則你就不需要給力)。如果(如torek的回答中所述)這些提交也是從另一個分支B引用的,那麼它們將保留在該分支中。如果稍後再合併兩個分支A和B,則A將包含「新」(強制)提交,並且B「舊」提交。
在這種情況下git merge
可能不會做你想要的。在最好的情況下,你會遇到合併衝突。最壞的情況下,你不會但結果仍然是錯誤的。例如,如果你使用git rebase -i
從A中刪除了一個提交c1,如果c1也在B中,那麼如果合併A和B,它將被重新引入。這可能會默默地重新引入一個bug :-(。因此,如果您強制推送,請確保您移除的提交不從其他分支/標籤引用(或強制推送這些分支/標籤)。
插圖中刪除承諾 「迴歸」
運行的bash腳本以下的。該腳本創建一個Git倉庫,枝主,BRANCH1具有如下的提交:
然後:
- 使用
git reset --hard
放棄來自主人的「不良提交」
- 合併BRANCH1成主從劇本
輸出:
Initialized empty Git repository in ....
[... creating commits ...]
### Bad commit in history:
* 7549dcc (HEAD, master) bad commit
* 31afec8 Initial
### Removing bad commit:
HEAD is now at 31afec8 Initial
### Bad commit no longer in history:
31afec8 (HEAD, master) Initial
### Merging branch1:
Updating 31afec8..be801e5
Fast-forward
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 b
create mode 100644 c
### Bad commit is back!
be801e5 (HEAD, master, branch1) good commit
7549dcc bad commit
31afec8 Initial
正如你可以看到,使用git reset --hard
「壞承諾」 從主刪除。然而,「bad commit」仍然包含在branch1中,所以當branch1合併到master中時,「bad commit」會返回。
注意:本示例實際上並未強制推送,但如果您使用上游回購協議,則必須在移除錯誤提交後強制推送 - 結果將相同。
腳本:
#!/bin/bash
set -e
if [ -e gitrepo ]; then echo "Please remove gitrepo"; exit 1; fi
git init gitrepo; cd gitrepo; git config core.pager cat
touch a; git add a; git commit -m Initial
touch b; git add b; git commit -m "bad commit"
git checkout -b branch1; touch c; git add c; git commit -m "good commit"
git checkout master
echo "### Bad commit in history: "
git log --oneline --decorate
echo "### Removing bad commit: "
git reset --hard HEAD~1
echo "### Bad commit no longer in history: "
git log --oneline --decorate
echo "### Merging branch1: "
git merge branch1
echo "### Bad commit is back!"
git log --oneline --decorate
+1。至於「新即將發佈的git版本有一個新功能,它使用你的reflogs來確定是否以及何時發生了」上游rebase「,它是'fork_point = $(git merge-base -fork-point origin /主題); git rebase - 去往origin/master $ fork_point topic'。請參閱http://stackoverflow.com/a/20423029/6309。我不能等待那個:) – VonC
謝謝!這些正是我所尋找的細節。 –