使用私有远程存储库重写git历史记录

时间:2013-11-01 13:04:10

标签: git

我使用私有远程存储库有两个主要原因,当我从办公室到家或在两台开发机器之间同步代码时,备份正在进行的工作。

我最近开始玩git(来自hg),我喜欢重写历史的想法。我最近发现的是如果我做以下

  • #do work
  • git commit
  • git push
  • #修复上次提交的一个小问题
  • git commit --amend
  • git push

与遥控器存在冲突。我需要再次拉动,合并和推动。

  1. 有没有办法将我的本地更改镜像到远程存储库?
  2. 在我的第二台机器上,如何将遥控器的镜像拉到我的本地(最好不再使用完整的克隆)
  3. 我知道我是唯一一个使用它的人,所以我知道没有人会处理不断变化的历史。

4 个答案:

答案 0 :(得分:2)

您可以在第二台计算机上强制推送git push -f remote-name branch-name,然后只推git pull。如果存在冲突,您可以使用git fetch --all后跟git reset --hard remote-name/branch-name来强行拉动。你最好确定你在做什么,不推荐重写历史作为常规工作流程的一部分。

我的意思是不建议经常强行推拉。

答案 1 :(得分:1)

您也可以执行

   git reset HEAD^ --hard 

在远程存储库和重做git push之后执行git pull形成本地存储库。我认为它比git push --force更危险,但更复杂,因为你只需要验证你正在倒回正确的东西,你可以随时使用

保存远程存储库的安全副本。
    git checkout -b safe-copy-old-branch-name

在做所有事情之前,不仅保留了提交背后的“意图”原件,而且保持完全相同(原始)SHA1。

答案 2 :(得分:1)

你可以将“交换/备份”遥控器设置为一个镜像(一个采用“强制”样式引用更新的裸克隆,而不是要求某些或所有引用更新是快进的。)

设置“正常”克隆以对refs/remotes/*进行强制更新:看看.git/config(或使用git config --get remote.origin.fetch),您会看到获取参考指针origin是:

+refs/heads/*:refs/remotes/origin/*

加号表示“强制”,即“不需要快进”。因此,当你git fetch origin时,无论提交SHA1(例如)来自refs/heads/master名称的是什么,都会成为你的本地refs/remotes/origin/master,无论你的refs/remotes/origin/master曾经提交过什么SHA1指向。这通常是安全的(因此即使对于“普通”克隆也是默认的)因为这些“远程分支”SHA1指针名称在refs/remotes/而不是refs/heads结束,即它不会影响您的< em> local repo的分支名称空间。

当你使用git push -f时 - 或者指定以+开头的push refspec,这意味着push和fetch相同 - 这告诉遥控器它也应该允许非快进。 (也就是说,它告诉你想要一个更好的短语 - “内置钩子”来允许快进。你所推动的遥控器上的其他git挂钩仍然可以拒绝改变。)这通常是 not 是安全的,因为它会影响远程回购的名称空间:您正在更新 refs/heads/master,而不是refs/pushes/JohnsMachineAtHome/master。但是,如果你知道自己在做什么,并且不犯错误(或者至少不会犯错误:-)),那么它毕竟是可以的。

还记得git中的每个提交都是相当粘的,只要有一些引用(例如,reflog)指向它,所以在特定意义上,只要你提交就强制推送和强制获取是安全的第一。 (如果你搞砸了,你可能不得不从家里/工作ssh到工作/家里,并在reflog中找到你放在镜子上的提交。)请注意裸克隆(包括裸镜克隆) )不要对reflogs保持这么多( 保留一些数据,特别是设置core.logAllRefUpdates;请参阅git config docs),因为他们得到的更新是集体的在推或取时间。

另请参阅这些git配置选项:

   remote.<name>.push
       The default set of "refspec" for git-push(1). See git-push(1).

   remote.<name>.mirror
       If true, pushing to this remote will automatically behave as if the
       --mirror option was given on the command line.

答案 3 :(得分:0)

您可以在临时分支上工作并在将其与主分支合并之前对其进行重新绑定。重新定位( - &gt;'git rebase -i master')允许您重新排序和编辑提交。