Git : 如何重置与项目关联的所有存储库的历史记录?
Git : How to reset the history of all the repositories associated with a project?
我们是使用 BitBucket 上的中央存储库从事一个项目的两名开发人员。
有时我想将历史重置为特定版本(我知道这会丢失信息):
git.exe reset --mixed 0e827d5fcb7d9b
git.exe push --all --force
这正确地将历史重置为我想要的修订版。但是,如果第二个开发人员不做同样的事情,如果他没有重置他自己的 local 存储库,那么他将要进行的下一次推送 将添加返回我用 reset!
删除的所有提交
当项目只有两个开发人员时,情况还不错。我可能会要求其他开发人员 运行 在其本地存储库上进行相同的重置,BitBucket 上的历史记录将按照我的意愿保留。但我想知道是否有办法强制重置与该项目关联的所有存储库的历史记录?一种强制第二个开发人员在他再次推送到 BitBucket 之前将其本地存储库重置为我的存储库的方法?
或者我遗漏了一些明显的东西(我不是 Git 大师)...
您可以简单地重置并创建一个单独的分支。
git checkout -b newBranch 0e827d5fcb7d9b
git push -u origin newBranch
推送新分支将允许您拥有自己的分支来重置和强制推送,而不会打扰第二个开发人员。
但是如果您想强制第二个开发人员在推回之前重置 his/her 自己的工作区,您应该:
- 重置(如您所愿)
修改提交(强制提交 0e827d5fcb7d9b 具有新的 SHA1)
git commit --amend -m "reset branch"
强推
那么默认情况下,来自其他开发人员的任何推送都会被拒绝,因为它们是非快进的。
他们需要获取,或者在 origin/master
之上重新设置他们自己的分支。或者将他们自己的工作树重置为新的 upstream/master
.
不,没有办法强迫其他开发人员做任何事情。
如果您了解 git
中的分支没有实质内容,这将有所帮助。它只是一个指向提交的字符串。它没有结构,也没有别的。
这意味着 git push --all --force
除了更新远程上的所有分支 "sticky notes" 以指向您让它们指向本地存储库中的任何提交之外,没有什么特别的。
要让其他开发人员接受您的更改,您必须与他们沟通并告诉他们做类似 git fetch ; git branch -D somebranch ; git checkout somebranch
的事情,这将产生删除他们自己的 somebranch
便签和将其替换为您的(他们刚刚从遥控器中获取的)。 somebranch
可以是 master
因为 master
分支根本没有什么神奇之处,它也只是一个指向某个提交的便签。
如果你按照你说的去做,即 reset
然后强制推送,无论如何你已经对其他开发人员造成了破坏;他们基本上只能选择按原样接受您的更改,或者以相同的方式覆盖它们;合并或其他事情几乎是不可能的,因为它们很可能最终会陷入混乱。
根据您当前的模型,所有开发人员都对 "central" 存储库具有写入权限,这是不可能的。
但是,对于太多的开发人员来说,整个工作流程的扩展性并不好。您可能需要考虑另一种存储库拓扑结构,其中每个开发人员都有一个私有存储库和一个 public 存储库。所有开发者都拥有对自己的 public 存储库 (SSH) 的写入权限,以及对其他人的 public 存储库 (HTTP?) 的只读访问权限。
每个开发人员将他的更改推送到自己的 public 存储库,并要求独裁者从中提取。独裁者依次从开发者的 public 仓库中获取到他自己的本地仓库中,并检查分支。如果它基于先前删除的提交,他将拒绝它。
这假设项目中有一个独裁者负责合并其他人的东西。独裁者的 origin
遥控器将指向他自己的 public 存储库,并且他将有其他遥控器可以从他的开发伙伴的 public 存储库中提取。其他开发者也将有一个额外的遥控器,最好称为 upstream
,指向 Dictator 的 public 存储库,以获取项目的官方状态。
我们是使用 BitBucket 上的中央存储库从事一个项目的两名开发人员。
有时我想将历史重置为特定版本(我知道这会丢失信息):
git.exe reset --mixed 0e827d5fcb7d9b
git.exe push --all --force
这正确地将历史重置为我想要的修订版。但是,如果第二个开发人员不做同样的事情,如果他没有重置他自己的 local 存储库,那么他将要进行的下一次推送 将添加返回我用 reset!
删除的所有提交当项目只有两个开发人员时,情况还不错。我可能会要求其他开发人员 运行 在其本地存储库上进行相同的重置,BitBucket 上的历史记录将按照我的意愿保留。但我想知道是否有办法强制重置与该项目关联的所有存储库的历史记录?一种强制第二个开发人员在他再次推送到 BitBucket 之前将其本地存储库重置为我的存储库的方法?
或者我遗漏了一些明显的东西(我不是 Git 大师)...
您可以简单地重置并创建一个单独的分支。
git checkout -b newBranch 0e827d5fcb7d9b
git push -u origin newBranch
推送新分支将允许您拥有自己的分支来重置和强制推送,而不会打扰第二个开发人员。
但是如果您想强制第二个开发人员在推回之前重置 his/her 自己的工作区,您应该:
- 重置(如您所愿)
修改提交(强制提交 0e827d5fcb7d9b 具有新的 SHA1)
git commit --amend -m "reset branch"
强推
那么默认情况下,来自其他开发人员的任何推送都会被拒绝,因为它们是非快进的。
他们需要获取,或者在 origin/master
之上重新设置他们自己的分支。或者将他们自己的工作树重置为新的 upstream/master
.
不,没有办法强迫其他开发人员做任何事情。
如果您了解 git
中的分支没有实质内容,这将有所帮助。它只是一个指向提交的字符串。它没有结构,也没有别的。
这意味着 git push --all --force
除了更新远程上的所有分支 "sticky notes" 以指向您让它们指向本地存储库中的任何提交之外,没有什么特别的。
要让其他开发人员接受您的更改,您必须与他们沟通并告诉他们做类似 git fetch ; git branch -D somebranch ; git checkout somebranch
的事情,这将产生删除他们自己的 somebranch
便签和将其替换为您的(他们刚刚从遥控器中获取的)。 somebranch
可以是 master
因为 master
分支根本没有什么神奇之处,它也只是一个指向某个提交的便签。
如果你按照你说的去做,即 reset
然后强制推送,无论如何你已经对其他开发人员造成了破坏;他们基本上只能选择按原样接受您的更改,或者以相同的方式覆盖它们;合并或其他事情几乎是不可能的,因为它们很可能最终会陷入混乱。
根据您当前的模型,所有开发人员都对 "central" 存储库具有写入权限,这是不可能的。
但是,对于太多的开发人员来说,整个工作流程的扩展性并不好。您可能需要考虑另一种存储库拓扑结构,其中每个开发人员都有一个私有存储库和一个 public 存储库。所有开发者都拥有对自己的 public 存储库 (SSH) 的写入权限,以及对其他人的 public 存储库 (HTTP?) 的只读访问权限。
每个开发人员将他的更改推送到自己的 public 存储库,并要求独裁者从中提取。独裁者依次从开发者的 public 仓库中获取到他自己的本地仓库中,并检查分支。如果它基于先前删除的提交,他将拒绝它。
这假设项目中有一个独裁者负责合并其他人的东西。独裁者的 origin
遥控器将指向他自己的 public 存储库,并且他将有其他遥控器可以从他的开发伙伴的 public 存储库中提取。其他开发者也将有一个额外的遥控器,最好称为 upstream
,指向 Dictator 的 public 存储库,以获取项目的官方状态。