GIT - 如何在不携带更改的情况下切换分支,反之亦然

4

最近我们从TFS转移到GIT,所以我还在学习如何使用这个令人惊叹的工具。

目前我正在使用以下非常简单的结构:

main -------------------------------------- 01 ----------
\                                           /
 dev ----------------------- 01 ---------- 02 ----------
  \                          /             /
   feat/login ------ 01 --- 02 --- 03 --- 04 --- 05 ---
  • 开发人员在feature/something上工作,每隔一段时间就会进行检查并触发测试构建。
  • 当功能稳定后,他们将feature/something合并回dev中,其中包含1个或多个来自feature/something的提交。
  • 当整个功能准备好时,他们将从dev将该功能合并到main中。

以下是问题:

  • 如果我从feat/login开始工作,如果我执行git checkout dev,我不仅获取不到来自dev的最新代码,而且还保留了在feat/login中修改但未提交的本地变更。如何在不带入之前分支的本地更改的情况下检出dev?
  • 假设一个开发者犯了一个错误,如何回滚到dev中的先前提交01并推送它,以便最新提交02不再是最新提交?

3
在切换到另一个分支之前,你需要将你的更改进行stash(储藏)或者commit(提交)。 - Cory Kramer
1
第一个问题,您是在问如何在切换到dev时删除这些本地更改吗?如果您想保留它们,则必须在切换之前将其提交或隐藏,但是如果您只想删除它们,请在切换后执行git reset。请记住,当您稍后切换回来时,它们不会神奇地重新出现,这就是为什么您必须在切换之前提交或隐藏的原因。 - Lasse V. Karlsen
快点! 大家写一个答案,这样我就可以标记它为正确的了。git resetstash,我不知道 :-) - Raffaeu
对于第二个问题,错误是否严重到你想删除整个提交记录?那是历史重写,如果你还在学习git,不建议这样做。如果可以将错误保留在仓库中,只是想撤消其影响,请使用 git revert 提交记录的SHA值 创建另一个提交记录,以撤消你想要撤消的提交记录的影响。 - Lasse V. Karlsen
2个回答

10

1) 存储您的更改,检出到另一个分支,在那里进行一些更改,然后返回到原始分支并应用/弹出您的存储。

$ git stash
$ git checkout dev

# do something in you dev branch

$ git checkout feat/login
$ git stash apply

您可以使用命令$ git stash list查看您的存储列表。

2)看起来您想撤消更改。我建议您不要在刚开始学习时玩弄git历史记录。无论如何,如果您确实想尝试一下,这里有一个很好的答案告诉您如何做。就像Lasse所说的那样,最好创建另一个提交以撤消您想要撤销的提交的影响。


1
或许值得注意的是,stash 无法处理未被跟踪的文件 - 如果您有不想“携带”的未跟踪文件,则必须先提交它们,或者将其暂存然后再进行 stash。 - Dunno
7
小技巧:你也可以使用 git stash -u 命令来隐藏未被跟踪的文件。 - Saugat

3

另一个可能使用的功能是git worktreehttps://git-scm.com/docs/git-worktree),它允许您同时拥有多个分支的工作副本,因此例如,让我们假设您正在主分支上:

git worktree add -b dev ../dev origin/dev
git worktree add -b feat_login ../feat_login origin/feat/login

这个功能会在../dev和../feat_login中为您提供额外的2个工作副本,其中包含dev和feat_login分支的工作副本。

我发现这个特性在需要频繁切换分支的项目中特别有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接