0

I use a private remote repository for two main reasons, backup my work in progress when I travel from the office to home or synchronise code between two development machines.

I have recently started playing with git (coming from hg) and I like the idea of rewriting history. What I found recently is if I do the following

  • # do work
  • git commit
  • git push
  • # Fix a little problem with the last commit
  • git commit --amend
  • git push

There is a conflict with the remote. I need to pull, merge and push again.

  1. Is there a way to mirror my local changes to the remote repository?
  2. On my second machine, how do I pull those mirror the remote into my local (preferably without a full clone again)

I know that I'm the only one using it, so I know that no one else will have to deal with a changing history.

4

4 回答 4

2

您可以在第二台机器上使用git push -f remote-name branch-namethen强制推送。git pull如果有冲突,您可以强制拉动,git fetch --all然后按git reset --hard remote-name/branch-name. 不过,您最好确定自己在做什么,不建议将重写历史记录作为常规工作流程的一部分。

我的意思是说不建议定期强制推拉。

于 2013-11-01T13:15:40.780 回答
1

您还可以执行一个

   git reset HEAD^ --hard 

在远程存储库上,并在从本地存储库执行 git pull 后重做 git push。我认为它比 git push --force 更危险,但更复杂,因为你只需要验证你正在倒带正确的东西,你总是可以在远程存储库上保留一个安全副本

    git checkout -b safe-copy-old-branch-name

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

于 2013-11-01T13:52:34.760 回答
1

您可以将“交换/备份”远程设置为镜像(一个采用“强制”样式参考更新的裸克隆,而不是要求部分或全部参考更新是快进的)。

“正常”克隆设置为执行强制更新refs/remotes/*:查看.git/config(或使用git config --get remote.origin.fetch),您会看到 fetch refspec 为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,也就是说,它不会以任何方式影响您的本地repo 的分支名称空间。

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

还要记住,只要有一些引用(例如,reflog)指向它,git 中的每个提交都是合理的,所以在这个特定的意义上,只要你先提交,强制推送和强制获取是安全的。(例如,如果你搞砸了,你可能不得不从家里/工作中 ssh 到工作/回家,并在 reflog 中四处寻找你在镜像上放置的提交。)注意裸克隆(包括裸镜像克隆) ) 不要以 reflogs 的方式保留所有内容(保留了一些数据,尤其是使用setcore.logAllRefUpdates;请参阅 git config 文档),因为它们获得的更新是在推送或获取时集中进行的。

另请参阅这些 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.
于 2013-11-01T14:00:38.323 回答
0

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

于 2013-11-01T13:10:32.463 回答