雖然我的回答是超出你的要求,我認爲這實際上是你打算做的。您使用git reset --soft HEAD^
撤消您提交的提交。這之前,你的承諾(因爲HEAD
點返回工作副本的狀態,以你目前的承諾,並HEAD^
指向一個之前(假定只有一個父)。
但是現在,當你git push
你被告知的東西像:
! [rejected] <branch> -> <branch>e (non-fast-forward)
error: failed to push some refs to 'ssh://<remote server>/<remote path>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
這是說,提交不排隊,它的存在阻止你犯了一個錯誤,錯誤消息是有點誤導,你不想做什麼暗示。 (拉動你的分支同步)你只能知道不這樣做是因爲你的意圖。
可以解決這個只是得到一個--force
(或-f
)(*):
git push --force
您可能需要重新設置上游:
git push --force --set-upstream origin <branch>
請注意,這將有如果其他人已經撤回你的工作,將會產生後果,因爲將會有不同的提交(可能)進行相同的更改。請參閱https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewriting-history。
爲了防止,永遠只能做推到你的分支任何問題(不是一些公共分支 - 例如development
分支的開發者合併其所有功能分支成),並一定要在你的團隊開放的溝通。
開發人員將通常使用這個模式我稱之爲週五下午提交您希望在情況的硬件故障週末前保存您的工作(但回到上週一提交前的狀態) 。
*Friday*
git add --all # To add all files whether they are tracked or not
git commit -m "Friday afternoon commit"
git --set-upstream push # --set-upstream is for if the branch doesn't exist on the remote server
*Monday*
git reset --soft HEAD^
git push -f --set-upstream origin <branch>
做這種方式,而在另一個答案討論git revert
的好處,是避免多餘的提交。重置將有2個提交,這種方式將沒有(沒有額外的)。 git reset
的優勢在於它不會重寫歷史記錄,所以更安全,特別是如果您不確定自己在做什麼。
(*)通常將存儲庫配置爲不讓您執行此操作以便掌握 - 修復分支並創建拉取請求。因爲如果你已經閱讀過上面的鏈接,重寫master的歷史將產生嚴重的後果(除非你是唯一一個克隆該代碼的人)。
謝謝,這是有道理的,雖然這可能會更好,因爲它並沒有真正解決我的問題。不過謝謝。 – 2010-01-06 22:10:13