在 Git 中继续使用当前 HEAD 的简单方法?
Easy way to keep using current HEAD in Git?
我在Git中有以下情况:我做了很多重构和分离头部,因为我在版本之间来回走了几次。由于头部分离,我无法再提交到 origin/master 远程 b运行ch。
HEAD 是我想要保留的版本。我尝试的是将 origin/master 远程 b运行ch 合并到 HEAD 中,这样我就可以提交那个版本了。在合并期间我说我想在有冲突的地方保留我自己的更改。
结果一团糟,丢失了很多文件。还好我在手术前做了一份文件拷贝,这样我就可以回到刚才描述的情况了。
现在我卡住了。我不想经历每一个变化并决定我想保留什么(有很多)。我只想将丢失的 HEAD 提交回 origin/master,包括新的目录结构。有什么简单的方法吗?
--
在我 运行 通过 @Martin 推荐的步骤后,我现在的状态是这些(也请参阅评论):
当我处于一个我想保留的分离的 HEAD 中时,我总是首先在这一点上创建一个新的分支。假设您可以使用命令行,这是行:
git checkout -b branch_clean_version_of_stuff
现在可以很容易地在当前条件下找回您的作品。现在你也可以合并回 origin master 并推回 origin。
您可以结帐 master 并合并您的 HEAD。我在下面将其命名为 good_stuff 以避免必须知道 sha-1...
(假设所有内容都已提交到您当前的 HEAD 上)
git checkout -b good_stuff HEAD
git checkout master
git merge good_stuff
解决冲突
git commit
以后做这个的时候,不要在分离的 HEAD 上工作,做一个分支。 Git 中的分支机构实际上是免费的。
要处理已处理的分离 HEAD,请在分离 HEAD git checkout -b whatever
处创建并检出一个分支,现在将其视为普通分支。您可以像往常一样将其合并到 master 中。
要解决您当前合并分离的问题(我怀疑您忘记签出新分支),记下 HEAD 的提交 ID(或标记它),然后...
- git结帐大师
- git 重置 --hard
git reset
将分支标签移动到任意提交。
在第一张图中,很明显HEAD是基于一个commit back relative master
。您在 master
上执行了 git checkout HEAD^
以进入分离状态,然后从那里开始工作。实际上,你在一个无名的分支上。您可以轻松地在 master
:
之上重新设置基准
git rebase master
rebase 后,这些更改将从 master
的尖端开始,而不是 master^
。换句话说,现在的变化是 "fast-forward" 相对于 master
.
此时,您仍处于超脱状态。您可以简单地切换到 master
:
git checkout master
Git 将警告您正在离开分离状态并给您 SHA。复制该 SHA 并执行此操作:
# on master now
git rebase SHA # fast-forward to SHA
注意:因为我们知道将 master
移动到 SHA
的更新是一个快进更改,我们也可以用 git reset --hard SHA
来完成。
如果你用 rebase 这样做,你可以避免创建 git 合并的混乱、非线性的历史特征。
只有当你不能用变基重写历史时才应该进行合并(因为历史已经发布到其他存储库)。这种情况不仅历史没有公布,连名字都没有!
我在Git中有以下情况:我做了很多重构和分离头部,因为我在版本之间来回走了几次。由于头部分离,我无法再提交到 origin/master 远程 b运行ch。
HEAD 是我想要保留的版本。我尝试的是将 origin/master 远程 b运行ch 合并到 HEAD 中,这样我就可以提交那个版本了。在合并期间我说我想在有冲突的地方保留我自己的更改。
结果一团糟,丢失了很多文件。还好我在手术前做了一份文件拷贝,这样我就可以回到刚才描述的情况了。
现在我卡住了。我不想经历每一个变化并决定我想保留什么(有很多)。我只想将丢失的 HEAD 提交回 origin/master,包括新的目录结构。有什么简单的方法吗?
--
在我 运行 通过 @Martin 推荐的步骤后,我现在的状态是这些(也请参阅评论):
当我处于一个我想保留的分离的 HEAD 中时,我总是首先在这一点上创建一个新的分支。假设您可以使用命令行,这是行:
git checkout -b branch_clean_version_of_stuff
现在可以很容易地在当前条件下找回您的作品。现在你也可以合并回 origin master 并推回 origin。
您可以结帐 master 并合并您的 HEAD。我在下面将其命名为 good_stuff 以避免必须知道 sha-1...
(假设所有内容都已提交到您当前的 HEAD 上)
git checkout -b good_stuff HEAD
git checkout master
git merge good_stuff
解决冲突
git commit
以后做这个的时候,不要在分离的 HEAD 上工作,做一个分支。 Git 中的分支机构实际上是免费的。
要处理已处理的分离 HEAD,请在分离 HEAD git checkout -b whatever
处创建并检出一个分支,现在将其视为普通分支。您可以像往常一样将其合并到 master 中。
要解决您当前合并分离的问题(我怀疑您忘记签出新分支),记下 HEAD 的提交 ID(或标记它),然后...
- git结帐大师
- git 重置 --hard
git reset
将分支标签移动到任意提交。
在第一张图中,很明显HEAD是基于一个commit back relative master
。您在 master
上执行了 git checkout HEAD^
以进入分离状态,然后从那里开始工作。实际上,你在一个无名的分支上。您可以轻松地在 master
:
git rebase master
rebase 后,这些更改将从 master
的尖端开始,而不是 master^
。换句话说,现在的变化是 "fast-forward" 相对于 master
.
此时,您仍处于超脱状态。您可以简单地切换到 master
:
git checkout master
Git 将警告您正在离开分离状态并给您 SHA。复制该 SHA 并执行此操作:
# on master now
git rebase SHA # fast-forward to SHA
注意:因为我们知道将 master
移动到 SHA
的更新是一个快进更改,我们也可以用 git reset --hard SHA
来完成。
如果你用 rebase 这样做,你可以避免创建 git 合并的混乱、非线性的历史特征。
只有当你不能用变基重写历史时才应该进行合并(因为历史已经发布到其他存储库)。这种情况不仅历史没有公布,连名字都没有!