提交正在添加到其他分支的主分支



假设有4个文件A、B、C和D,其中文件A、B、C在主分支上提交。

我现在创建一个新的分支(称之为子分支(,执行git checkout sub-branch并进行更改,然后只提交文件D。

但是,当我通过运行git push -u origin sub-branch将文件D上提交的更改推送到远程存储库(Github(时,甚至文件A、B、C的提交也会添加到该分支中。

我只希望在文件d上提交的更改反映在新创建的分支中,我该如何实现这一点?

分支只是指向提交的指针。假设分支main包含以下提交:

X-A-B-C

并且main指向提交C。当您创建新分支时,您从main开始,这相当于从提交C:开始

git switch -c sub-branch main
# since main points to C this is the same as
git switch -c sub-branch C

相反,听起来你只需要从以前的提交中创建新的分支:

git switch -c sub-branch X

如果你这样做的话,sub-branch最终会变成X-D。由于您已经创建了分支,您可以通过将其重置回X并选择D:来修复它

git switch sub-branch
git reset --hard X
git cherry-pick D

但是,提交已经被推送到远程主分支。

新的分支将包括一个提交,只对D.进行更改

然而,它的父提交将来自分支主(以及在此之前的父提交(

这就是提交链:有向无环图(DAG(

当我创建一个从分叉回购的分支到原始回购的主分支的PR时,它显示4个文件被更改,而不是1个。

这可能是因为目标分支还没有这些文件。

如前所述,git log --oneline --graph --decorate --all --branches将显示该图。

我想知道如何获得X 的哈希

您也可以使用git merge-base:

git merge-base main sub-branch

有几个选项:

  1. 从远程签出(假设提交尚未被推送(
  2. 在主目录中进行更改A、B、C之前先签出分支,然后在新创建的分支中进行更改D
  3. 在进行更改A、B、Cgit checkout -b <new_branch_name> <sha1>之前从特定提交签出

在签出到新分支之前,请确保所有更改都已提交。

如果您不想提交,请重置或隐藏您的更改。

这将解决你的问题。

现在,如果您在分支D中提交任何内容,它将只推送这些更改。

最新更新