首页 > 解决方案 > Visual Studio Git 推送特定的传出提交

问题描述

我进行了几处代码更改,然后将它们从 Visual Studio Team Explorer 中的 (Changes) 提交到我的本地存储库。一旦我将更改提交到本地,所有提交都会自动列在(同步)传出提交中。但是,我只打算推送一些,而不是所有的提交到远程仓库。如何从列表中删除我不打算推​​送的任何项目或仅选择我打算推送的项目?谢谢!

标签: gitvisual-studiogit-pushteam-explorer

解决方案


git每个提交中指向其父级,然后指向其父级,依此类推,直到您到达第一个提交。

所以,如果你有这个本地分支:

myBranch           o--A--X--B--Y--C--Z

但是您只想将提交推XYZ送到remote获取:

remote/myBranch    o--X--Y--Z

这是不可能的。提交Z有父级C,它不能有父级Y


无论如何,让我们做吧

我知道我刚才说过这是不可能的,但我们可以做一些非常接近的事情。

从这个结构开始:

master      o
             \
myBranch      A--X--B--Y--C--Z

我们想分离ABCand XYZ,推XYZ送到远程,并保留ABC在本地。

  1. git checkout myBranch- 切换到当前分支,上面有所有内容
  2. git branch -b myBranch-old- 创建分支原始状态的副本
  3. git log- 列出从最近开始的提交。记下每个提交的完整提交 ID
  4. git reset --hard master- 在应用任何更改之前重置myBranch(注意:如果您在这里没有方便的分支,您可以使用上面的适当提交 ID)
  5. git cherry-pick X- 将提交复制X到当前分支
  6. git cherry-pick Y- 将提交复制Y到当前分支
  7. git cherry-pick Z- 将提交复制Z到当前分支
  8. git push --force- 将当前更改推送到遥控器。这--force是必要的,因为我们正在改写历史

当前状态:

master                o
                      |\
myBranch (and remote) \ X`-Y`-Z`
                       \
myBranch-old            A--X--B--Y--C--Z

现在重新应用其他更改。

  1. git cherry-pick A- 将提交复制A到当前分支
  2. git cherry-pick B- 将提交复制B到当前分支
  3. git cherry-pick C- 将提交复制C到当前分支

最终状态:

master                o
                      |\
remote/myBranch       | X`-Y`-Z`
                      |        \
myBranch              \         A`-B`-C`
                       \
myBranch-old            A--X--B--Y--C--Z

现在删除myBranch-old,一切都完成了。


但这太疯狂了!

是的。最重要的是,您不应该像这样混合不相关的更改。分支是你的朋友。做更多的分支。在git, 不像TFSorSVN中,分支几乎是免费的——无论是在存储还是处理方面。事实上,成本是如此之低,我并不担心团队存储库中的分支数量,直到它达到 1000 个为止。即便如此,更关心的是阅读这么多分支,而不是实际的性能影响。

我不知道你是如何进入提示这个问题的情况的,但修复总是相同的:新任务 = 新分支。总是


推荐阅读