2014-06-28 40 views
4

有没有办法使用git push -f,但是自上次拉动以来只有origin/master没有改变?如何使'git push -f`“安全”

我只想重组历史,而不是覆盖文件内容。

+0

为什么不干脆不使用武力推?你是什​​么意思你“重组”历史? –

+3

这个问题的要点:当试图重写历史记录时,必须强制推送更新远程。但是,在从远程获取最新版本并重写它到强制推送的时间之间,可能会在远程发生其他更改。所以为了安全起见,在你强制推送之前,你应该再次提取,以确保你不会覆盖以前没有见过的新东西。但是'fetch && push -f'仍然允许发生变化的(非常短的)中断。因此,我们希望只有一个“强制推送 - 但是只要是远程的,仍然是提交XY”。 – poke

+0

参见http://stackoverflow.com/a/18505634/6309和(用于恢复强制推送)http://stackoverflow.com/a/20423029/6309 – VonC

回答

7

git push有一个选项--force-with-lease。这样做

git push --force-with-lease 

会做什么,你的愿望,只有强制更新远程分支,如果它仍然是相同版本的远程跟踪分支(即origin/branch)。

您也可以明确地指定某个版本,如果你想检查另一个版本:

git push --force-with-lease=branch:someCommitHash 
+0

这让我感兴趣。只是为了确保我明白:只要你在重写历史的时候不取回,你应该没问题。即紧接在'--force-with-lease'之前获取'with-lease'部分(因为它可能更新“origin/branch”)。 –

+0

不,如果您重写历史记录(以任何方式)并且使用'--force'强制推送,您将覆盖遥控器上的任何内容,而不管在那里发生了什么。同时,使用'--force-with-lease'代替强制推送和覆盖所有内容*,但只有*当远程分支没有发生任何事情时,确保你不覆盖你不知道的东西。 – poke

+0

当然,但如果你在使用'--force-with-lease'之前立即获取,那么'origin/branch'将会是“最新的”(即使你重写的“branch”不是)。这意味着如果您获取,没有'--force-with-lease'提供的保护。 –