git在分支之间快速切换的最佳实践

git在分支之间快速切换的最佳实践,git,Git,我需要同时处理多个活动分支。显然,我可以创建两个工作目录,每个目录有一个不同的分支。这是唯一不必“提交”和“签出”就可以从一个分支切换到另一个分支的方法吗?是的,但是如果您还没有准备好完成当前正在进行的工作,可以使用git stash而不是commit,是一个很好的选择,可以同时在多个分支上工作 我通常将一个本地裸回购复制到多个副本中(每个活动分支一个副本),并将该裸回购用作中央集成回购(因为我可以轻松推送至裸回购,而不能推送至非裸回购)。如果您临时切换分支git stash,则非常有用,记住,

我需要同时处理多个活动分支。显然,我可以创建两个工作目录,每个目录有一个不同的分支。这是唯一不必“提交”和“签出”就可以从一个分支切换到另一个分支的方法吗?

是的,但是如果您还没有准备好完成当前正在进行的工作,可以使用
git stash
而不是
commit
,是一个很好的选择,可以同时在多个分支上工作


我通常将一个本地裸回购复制到多个副本中(每个活动分支一个副本),并将该裸回购用作中央集成回购(因为我可以轻松推送至裸回购,而不能推送至非裸回购)。

如果您临时切换分支
git stash
,则非常有用,记住,承诺不需要永远坚持;您可以进行临时提交,以便稍后回滚

因此,我的建议是,如果这是一个长达数小时的切换,那么改为执行
git commit
,因为根据您的内存,存储可能很容易忘记/丢失/等等

[In MyBranch]
>$ git commit -m "WIP: Stuff I was working on."
>$ git checkout AnotherBranch
[Do Stuff]
>$ git checkout MyBranch
>$ git reset HEAD^
[Continue]

由于这是一个关于最佳实践的问题,请记住使用
git stash save
为您的存储提供有用的信息
,否则以后可能很难找到。

如果您正在进行所谓的按功能分支开发,如下所述:

您可能还希望确保切换数据库架构。Git可以通过涂抹和清理来帮助实现这一点。这样就可以在本地管理多个数据库。签出新分支时,会涂抹连接字符串以用分支名称注释数据库名称。如果在任何时候提交了配置文件,则通过从连接中删除分支的名称来清除配置文件


有关更多信息,请查看。

我厌倦了在分支之间切换,因此我编写了一个更智能的
git签出。将以下内容插入您的
~/.bash_配置文件
,获取它的源代码,然后只需使用
gch
切换到您所在的上一个分支

current_git_branch() {
    git branch | grep \* | awk '{ print $2 }'
}
# a smart git checkout, with no args it switches to last branch.
gch() {
    if [ -n "$1" ]; then 
        echo `current_git_branch` >"/tmp/last_git_branch_used.txt"
        git checkout "$@"
    else
        if [ ! -f "/tmp/last_git_branch_used.txt" ]; then echo >&2 "ERROR: Please run gch with 1 argument first."
        else
            echo `current_git_branch` >"/tmp/last_git_branch_used.temp"
            git checkout `cat /tmp/last_git_branch_used.txt`
            mv "/tmp/last_git_branch_used."{temp,txt}
        fi
    fi
}

我有一个bash函数,如下所示:

function gitredocommit {
  lastcomment=`git log | grep Date -A 2 -m 1 | tail -1 | sed -e 's/^ *//' -e 's/ *$//' | grep -v Merge`
  if [ -n "$lastcomment"  ]; then
    git reset --soft HEAD^; git add ../; git commit -m"$lastcomment"
  else
    echo "last commit was a merge, won't redo it"
  fi
}
您创建一个新分支,进行第一次(和最后一次)提交,然后使用它您可以执行新操作并覆盖此提交。如果您需要从主机更新,请使用

git rebase master

当然,因此您的提交始终位于分支的顶部。只要不在master中合并分支,此操作就有效

关于“裸回购”的理由,请参见示例。这就是人们使用svn所做的,现在您可以使用git分支功能,您不需要很多本地存储库。这是git的要点。@GismoRanas我同意。我在4年多前写过这篇文章;)我不知道这个命令。我喜欢它,因为它正是我所想的。只是一个放置我的东西的地方,直到我真的准备好承诺。在过去的一周里,我已经多次提交“snap”,以便我可以更改分支。这让我非常生气,因为这些变化中有很多可能会再次改变。。。同时,当我推动时,这些更改将向我的团队公开。。。其中一些可能会令人尴尬。“隐藏”应尽快进行测试。谢谢很乐意帮忙。正如cweider所指出的,认识到只要没有强制提交,就可以重写本地历史记录,这一点很重要。例如,如果您想在其他提交之间保留一个“快照”提交,您可以
将其挑选到另一个分支中,然后执行
重新基-i
将其从另一个分支中删除。您是如何检测提交是否为合并的
lastcomment=
行的?请参见行末,使用神奇的水平滚动条。对不起,这是我试图说的“这是一种完全疯狂的方法来检测某个东西是否是合并提交,它是否具有可怕的性能影响”。试着改用
git rev parse HEAD ^2
。如果它有效,那么它就不会被发表在胡说八道的计算机科学学术专家的年鉴上。不管怎样,谢谢你的建议,我会检查它能提高多少皮秒的性能。除非它不起作用。您没有检测到合并提交,而是检测到单词“merge”并得到误报和否定。如果你在一个中等规模的项目上做了
git log
(不带-1),你说的是浪费10秒到10分钟。一年多以后,你还会这样处理这个问题吗?只是好奇,因为我一直在寻找这个是的,这个片段仍然在我的bash配置文件中。这样做的一个缺点是,
last\u git\u branch\u used.txt
不包含有关git回购的信息,因此如果您在不同回购的不同分支之间来回切换,这就没有多大用处。但我仍然认为我已经节省了一百万次击键。过去几天我一直在使用它,发现它非常方便。我的大部分工作都是在一次回购中完成的,所以这绝对是我可以忍受的限制。顺便说一句,它可以与zsh配合使用(这并不奇怪,因为zsh是从bash派生的)。我将与我的团队的其他成员分享这一点。谢谢所以我对这个脚本做了一些改进,它缓存了以前切换到项目的.git文件夹的分支,不管您是否在子文件夹中。似乎可以使用
git checkout-
切换到以前签出的分支,这与
git checkout@{-1}
同义。您可以阅读。如果您在不同的PC机上工作(例如:在office-location-1和office-location-2),通过这种方式,您可以提交未完成的工作[在office-location-1]并将其推到远程,然后您可以拉[在office-location-2]并重置它,执行一些操作并进行最终完成的提交。:)