32

我不得不承认我没有玩过 gits 的高级功能,但在我当前的项目中我不得不这样做。

情况:有人试图实现一些功能并将它们提交给主人,现在我被要求做其他人试图做的事情(但失败了),因此,我做的第一件事是

git checkout -b clean_start HASH

哈希是在当前主服务器之前大约 20 次提交的正确 SHA1 哈希,并且有效。我现在对该分支进行了一些更改,现在我想将远程存储库的当前主分支(具有其他人所做的更改)更改为我的本地分支。

换句话说,我想将主 20 次提交的头部移回,然后将我的新干净分支合并到其中。

这正是我必须做的吗?使用 revert HEAD~20 等,或者是否有一个命令可以使头部移动?

4

3 回答 3

29

如果远程存储库接受强制推送,您可以这样做:

git push --force origin clean_start:master

请注意,如果其他人克隆了存储库,则来自他们的推送可能会撤消此操作。如果要合并本地 master 分支和远程 master 分支,但保留分支中的文件树(丢弃原始 master 的文件树),您可以这样做:

git merge -s ours --no-commit origin/master
git commit  # Separate step so that you can use your own commit message.
git checkout master
git merge clean_start  # Fast-forward
git push origin master

这将创建一个合并提交,其中两个分支(您的 master 和 origin 的 master)作为其父级,但树将与您当前的分支提示相同。换句话说,它将创建一个没有发生实际代码合并的符号合并。

如果您不介意在 repo 中工作的其他人会被打断,您可以使用第一种方法。但是如果你和其他已经有这些提交的人一起工作,第二种方法会更简单,并且会保留历史。

于 2010-11-24T22:14:15.490 回答
26
  1. 您可以专门将 master 指向您希望它所在的位置:

    git update-ref refs/heads/master clean_start
    

    (如果您正在跟踪新的变化clean_start并希望大师指向那里)

    请注意,无论 master 指向什么(大约 20 次提交)都将“丢失”。

    因此,您将需要强制推动 master :

    git push origin master -f
    
  2. 如果您想将本地 master 留在原处并将 clean_start 的位置推送到远程 master,只需执行以下操作:

    git push origin clean_start:master -f

    希望这可以帮助。

    PS。首先运行gitk --all &,这样您就可以在执行此操作时直观地看到发生了什么。

于 2010-11-24T22:14:18.623 回答
17

git reset命令用于更改 HEAD 指向的内容。

在您的情况下,您可以这样做:

git checkout master              # switch to the master branch
git reset --hard clean_start     # point HEAD to the clean_start branch
git push -f origin master:master # force push the new HEAD to server
于 2010-11-24T22:58:44.330 回答