1

我在 Git 中做了一些错误的变基和冲突解决,所以我最终陷入了这种愚蠢的境地:

*   8379515 (HEAD, origin/master, origin/HEAD, master) Merge branch 'binary-mobile'
|\
| * 21b247a (binary-mobile) Add Binary Mobile
| * c66dced Add Music Collection
* | cbbe364 Add task Music Collection
|/
* 8e9ccae Update README.md
* 31d2050 Reorganize repo and add README files
* 88fe4fd Rename readme file
* 8ed72bd Reorganize the structure of the repo
* 219a25a Update README.md
* 60921e6 Create README.md
* 1de4f36 Initial commit

我的问题是提交Add task Music Collection并且Add Music Collection是相同的。我想要:

  • 让我的分支走一条路;
  • 只有一个带有 title 的提交Add Music Collection

我可以做然后git rebase -i 8e9ccae压缩并重命名c66dced为吗?我认为首先的问题是我已经将我想要 rebase 的提交推送到了 Github,但我认为只要没有其他人在使用它们,这可以吗?cbbe364cbbe364Add Music Collection

4

3 回答 3

3

如果我遇到这个问题,我会做以下事情:

cbbe3641.) 将(exclusive) 和21b247a(inclusive)之间的提交重新定位到您的8e9ccae.

git rebase --onto 8e9ccae cbbe364 21b247a

这将提交c66dced21b247a直接移动到8e9ccae. 这将导致最新提交Add Binary Mobile的另一个哈希值,让我们将哈希值称为“commit2” (树可能不是 100% 准确,没有 git 存储库来重现它)

*   8379515 (HEAD, origin/master, origin/HEAD, master) Merge branch 'binary-mobile'
|\
| * 21b247a (binary-mobile) Add Binary Mobile
| * c66dced Add Music Collection
| | cbbe364 Add task Music Collection
|/
|
|
| * commit2 (HEAD) Add Binary Mobile
| * commit1 Add Music Collection
|/
* 8e9ccae Update README.md
* 31d2050 Reorganize repo and add README files
* 88fe4fd Rename readme file
* 8ed72bd Reorganize the structure of the repo
* 219a25a Update README.md
* 60921e6 Create README.md
* 1de4f36 Initial commit

2.) 之后将您的master向下(沿着“树”向下)移动到commit2

git branch -d master
git checkout commit2
git branch master

| * commit2 (HEAD, master) Add Binary Mobile
| * commit1 Add Music Collection
|/
* 8e9ccae Update README.md

3.)现在你有了master它所属的地方,即 on commit2。如果你想在“单行”上跟随你的分支,你需要摆脱binary-mobile分支,只需删除它:

git branch -D binary-mobile

因为提交21b247a现在没有分支名称,并且您不在此分支上工作(没有 HEAD),所以该分支将消失。

4.) 最后推送您的更改(在这种情况下需要强制)。这会将您origin/master向下移动到master,并且合并分支应该消失。

git push master --force


* commit2 (HEAD, master, origin/master) Add Binary Mobile
* commit1 Add Music Collection
* 8e9ccae Update README.md
* 31d2050 Reorganize repo and add README files
* 88fe4fd Rename readme file
* 8ed72bd Reorganize the structure of the repo
* 219a25a Update README.md
* 60921e6 Create README.md
* 1de4f36 Initial commit
于 2013-11-20T09:48:33.177 回答
1

如果我对您的理解正确,您只需检查并撤消您做错的事情。

使用git reflog参见此处),您可以检查您使用 git 存储库创建的所有内容的历史记录。所有这些更改都存储在 git 中,因此您可以返回存储库前 2 个月的任何状态。

使用 git reset --hard HEAD@{NumberOfTheChange}参见此处)您可以撤消存储库中的任何更改。(但请注意,这种方式您无法撤消文件中的更改,这些更改未被 git 跟踪)

在此之后,你可以做你想做的事。

于 2013-11-20T09:29:09.783 回答
1

我会做类似的事情:

  • 回到提交正常的位置
  • 在那里创建一个分支,然后挑选你想要的提交
  • git 重置到分支的起点,这将成为您的新主人/负责人,但您保存了中间提交
  • 合并分支并完成!:)

所以在代码中会是这样的:

git checkout 8e9ccae
git checkout -b better_changes
git cherry-pick c66dced
git cherry-pick 21b247a
git checkout master
git reset --hard HEAD^6  //check correct nr of steps with git reflog
git merge better_changes

然后强制推到原点:)

于 2013-11-20T09:58:25.510 回答