master
并提交了。否则,我必须在分支feature_x
中进行操作。现在我知道有一些命令,比如
git reset
。我的问题是,如果我重置,它会撤销我的代码还是只会撤销master
中的文件和提交?如何避免重置而不丢失代码?
更新:
代码尚未推送到远程。 当我尝试时,产生了错误:
错误:src refspec feature_x does not match any。
A - B - C - X - Y - Z <- master
git branch feature-x
feature-x分支将指向与主分支相同的提交版本,这使得将主分支重置到早期版本是安全的:
git reset --hard HEAD~3 # Move master branch 3 commits back
X - Y - Z <- feature-x
/
A - B - C <- master
git checkout feature-x
我通常使用:
git reset --soft HEAD^
git add
和提交到master
的更改,并将更改推送到分支feature_x
。 - Volatil3git cherry-pick
。 - ismailsunnimaster
分支上并运行了git add
,那么它们会被添加到master
节点中,而git push origin feature_x
将无法将这些提交的文件发送到feature_x
吗? - Volatil3git add
将文件添加到索引(即暂存区)。仅当您使用 git commit
提交它们时,已添加的更改才会成为提交/修订。它们将要提交到哪个分支取决于 git commit
期间检出的分支,而不是在 git add
期间检出的分支。如果您将一个分支推送到远程,只有它的提交将被推送,而不包括任何已添加但尚未提交的更改。 - das-g我不太清楚命令行的方式,但大多数Git客户端都有一个名为“放弃”(discard)的按钮。在Sourcetree中,这个按钮位于您的工具栏的第三个位置。点击它可以删除所有本地更改,如果您已经提交了这些更改,请使用还原(revert)功能来撤销它们。
master
分支上有提交记录,但您不想在master
分支上保留这些提交记录,而是希望将它们保持不变。相反,您希望这些提交记录出现在feature_x
分支上。我假设您想要的提交记录是master
上的最后一次提交记录,因此在它们之间没有您想要保留在master
上的提交记录。feature_x
分支尚不存在feature_x
已经存在...master
的祖先按照上述步骤进行,但在步骤1和步骤2之间(即在检出master
之前),使用以下命令将feature_x
移动到当前的master
:
git checkout feature_x
git merge --ff-only master
跳过第三步(创建分支feature_x
)。
master
上但是你想将这些提交与来自master
的相关提交一起保留在feature_x
上,那么你有几种选择。
最简单和最安全的方法是在步骤1和步骤2之间(即在你检出master
之前)将来自master
的提交合并到feature_x
中:
git checkout feature_x
git merge master # You might want to modify the suggested commit message,
# as 'merge master into feature_x' will be confusing when
# those commits won't be ancestors of 'master' later on.
然后从步骤2开始,跳过步骤3,继续进行。
如果您想要在feature_x
上获得线性历史记录,则有两种选择:将来自主分支的提交重新基于feature_x
的提交(这样就好像您一开始就在feature_x
上提交了它们,而且是在已经存在的提交之后),或者将来自feature_x
的提交重新基于主分支上的提交(这样就好像先前在主分支上的提交是在feature_x
上提交的,甚至是在已经存在的提交之前)。如果线性历史记录不是必须的,我建议不要使用这两个选项,因为重新基础可能会变得有点棘手,并且需要非常了解git。如果您仍然要追求其中之一,请确保知道自己在做什么(阅读您使用的命令的帮助页面),并且确保正确执行(确保您已经理解了这些帮助页面并尽量避免打错字)。特别是第一次重新基础时(但以后也是如此),可能值得制作存储库的本地副本,以便在出现问题时备份。
如果你想从不同的分支推送你的代码,你不需要撤销你的提交。
应该就可以了。
feature_x
,切换到该分支,然后将其推送到远程仓库。 - ismailsunnisrc refspec feature_x does not match any
可能意味着本地不存在分支feature_x
。要从远程获取,请运行命令git fetch && git checkout -b feature_x origin/feature_x
。(在较新的git版本中,您可以将其缩短为git fetch && git checkout feature_x
)。 - das-g