git 为什么我必须在切换分支之前隐藏/提交我的更改?

5n0oy7gb  于 2023-06-04  发布在  Git
关注(0)|答案(5)|浏览(247)

我发现这很烦人,因为我想快速切换分支并做一些事情,然后切换回我之前正在做的事情。我意识到我可以隐藏,然后检索隐藏,但我每次都必须输入这些行:/
有什么办法可以避免这样做吗?
我也觉得这很烦人,因为我保留了大约5或10个功能分支,很难管理哪些分支有需要检索的隐藏,哪些分支适合继续工作。

zazmityj

zazmityj1#

一种简单的方法是使用类似Legit的东西。我喜欢的Legit命令之一是git switch

$ git switch <branch>
# Switches to branch. Stashes and restores unstaged changes.

Legit使用遵循特定命名约定的描述存储stash。这样,当您使用git switch返回到第一个分支时,它可以自动释放为该分支保存的更改。

6xfqseft

6xfqseft2#

您可以使用git checkout--merge-m)选项。
使用它会导致在切换分支时执行三路合并。如果发生合并冲突,您可能需要解决这些冲突。
至于为什么会出现这种情况,手册中指出
切换分支时,如果您对当前分支和要切换到的分支之间的一个或多个文件进行了本地修改,则命令拒绝切换分支,以便在上下文中保留您的修改。
有关详细信息,请参阅git checkout manual page

ct3nt3jp

ct3nt3jp3#

我发现自己每天都和你一样
我保留了大约5或10个功能分支,很难管理哪些分支有需要检索的隐藏,哪些分支适合继续工作。
对我来说,最有效的解决方案也是最简单的(并在问题标题中提到):

提交正在进行的更改!

我总是用大写字母(在this popular standard之后)来写我的 * 真实的 * 提交,并且我所有正在进行的提交都以小写字母开头,所以它们在我推送之前立即突出需要交互式的变基。因此,如果我需要切换分支来帮助某人,我只需提交所有更改并使用提交消息,如:
wip:新CoolFeature API的草稿
顺便说一句,如果我也离开去喝咖啡,我也可能做出同样的提交,即使我不打算改变分支。

**交互式变基提示:**提交时,可以传递其他选项,例如:

git commit --squash=<commit-hash> # prep to squash this commit later
git commit --fixup=<commit-hash>  # prep to fixup this commit later

注意,这些将为您创建提交,提交消息前缀为“squash!”或“fixup!例如,在一个正常的一天里,我会提交一些提交,以及添加一些squash和fixup提交:

git log

5555555 Add thing 3
4444444 fixup! Update thing 2
3333333 squash! wip: rough draft of thing 1
2222222 Update thing 2
1111111 wip: rough draft of thing 1
0000000 Merge PR 12345: Do a thing (origin/main)

注意,我给提交标题起了这样的名字,我知道提交1111111仍在进行中,提交消息最终需要重写,而提交2222222“可能很好,准备好了”。我使用squash来更新commit 1111111并更改消息,并使用fixup来调整commit 2222222以进行squash,而无需更改commit消息。
下一次我使用rebase -i时,我将使用--autosquash选项,Git将遵循“squash”和“fixup”指令。下面是不使用--autosquash选项和使用--autosquash选项的比较。

定期交互变基:

git rebase origin/main -i

# Results in:
pick 1111111 wip: rough draft of thing 1
pick 2222222 Update thing 2
pick 3333333 squash! wip: rough draft of thing 1
pick 4444444 fixup! Update thing 2
pick 5555555 Add thing 3

使用autosquash的交互式变基:

git rebase origin/main -i --autosquash

# Results in:
pick 1111111 wip: rough draft of thing 1
squash 3333333 squash! wip: rough draft of thing 1
pick 2222222 Update thing 2
fixup 4444444 fixup! Update thing 2
pick 5555555 Add thing 3

正如您所看到的,使用--autosquash和正确的提交消息可以节省一点手工操作,因为Git会在rebase指令中为您重新安排提交。

daolsyd0

daolsyd04#

你可以使用git stash来隐藏你的更改。然后你可以更改分支,然后恢复分支并取回你的更改:

$ git stash
$ git checkout other_branch
$ git checkout original_branch
$ git stash pop
yrefmtwq

yrefmtwq5#

这实际上是解决您的一个问题的一个解决方案,但是您可以向每个stash添加一条消息,以便知道哪个stash属于哪个分支。这样做,你总是很容易知道哪些分支机构有一个藏匿,哪些没有。
要做到这一点,只需使用以下命令:

git stash save -u branch1

其中,'branch1'是您为藏匿点提供的消息或名称

相关问题