使用我们当前的设置,您在执行拉取时始终必须输入分支名称(即:git pull origin feature-branch
"。我已经犯了一个错误,从一个分支拉到另一个分支,不小心将两个分支合并到两个非常不同的版本。我想通过配置 Git 来避免这种情况,以便只需键入 git pull
即可拉取您所在的当前分支。
我该怎么做?
也是打字git pull
并获得所有魔力的粉丝。
您有 2 个选项:
1( git config --global branch.autoSetupMerge always
这将确保无论您是签出远程分支还是创建新分支;跟踪信息将由 git 自动处理。然后你就可以
git clone <some_repo>
git checkout -b <new_branch>
git push
git pull
请注意,为了在没有更多关键字的情况下push
,您还需要设置推送选项。我已将其设置为 matching
,但每个人都有自己的偏好。( git config --global push.default matching
(
详细信息:autosetupmerge
默认为 true
。设置为 true 时,这将允许 git 在远程签出现有分支时执行跟踪。例如,如果您执行git checkout <branch>
,git 将处理跟踪信息,以便您可以在该分支上执行git pull
。但是,它不会在使用该选项创建的分支上执行此操作-b
。将autosetupmerge
设置为 always
可确保 git 始终处理跟踪信息。
2(签出新分支时,需要专门设置分支以从原点拉取(又名跟踪(
git checkout -b <branch> --track <remote>/<branch>
当分支是暂时的时,我发现这不太有用。如果您很少创建新分支,则应使用此方法。但是,如果您像我一样,只有主分支是持久的,并且每个功能都有自己的全新分支,那么我发现选项 1 更有用。
请注意,您不需要将 git 配置--global
。您可以简单地在那里编写--local
,并且该设置仅特定于该存储库。
这对我有用:
git branch --set-upstream-to=origin/branch_name branch_name
完成此操作后,我可以使用以下语法:
git checkout branch_name
git pull --rebase
git push
您可以创建跟踪分支。来自 Git Book (http://git-scm.com/book/en/Git-Branching-Remote-Branches(:
克隆存储库时,它通常会自动创建一个
master
跟踪origin/master
的分支。这就是为什么git push
和git pull
开箱即用,没有其他参数。但是,你 如果您愿意,可以设置其他跟踪分支 - 不跟踪的分支 分支origin
,并且不跟踪master
分支。简单的 案例是你刚刚看到的例子,正在运行git checkout -b [branch] [remotename]/[branch]
.如果你有 Git 版本 1.6.2 或更高版本,您还可以使用--track
速记:$ git checkout --track origin/serverfix Branch serverfix set up to track remote branch refs/remotes/origin/serverfix. Switched to a new branch "serverfix"
如果您已将git push
配置为自动计算远程分支名称,则可以传递-u
,它还会自动设置跟踪分支。
要将 git push 设置为使用具有相同名称的远程分支,请执行以下操作:
git config --global push.default current`
git help push
-u
选项的说明:
-u, --set-upstream
For every branch that is up to date or successfully pushed, add
upstream (tracking) reference, used by argument-less git-pull(1) and
other commands. For more information, see branch.<name>.merge in
git-config(1).
假设您当前的分支<branch_name>
:
$ git push -u
Branch <branch_name> set up to track remote branch <branch_name> from origin.
Everything up-to-date
我需要将我的存储库与主分支同步,所以我最终得到了一个简单的 bash 脚本,该脚本可以获取更改并变基为主分支:
function git_do_rebase_with_master (){
current=$(pwd)
echo "Syncing $1 ..."
cd "$1"
git fetch origin
GIT_STASH_MESSAGE="Sync on $(date)"
echo $GIT_STASH_MESSAGE
git stash -m"${GIT_STASH_MESSAGE}"
git rebase origin/master
(git stash list | grep "${GIT_STASH_MESSAGE}" && git stash pop) || echo "Stash was not applied"
echo "Completed git sync current branch"
git log --name-status HEAD^..HEAD --pretty=oneline -1
echo "Completed syncing of $1 ..."
cd $current
}
alias sync_repo="git_do_rebase_with_master /path/to/repo"
我也是减少人为错误的简短命令的易用性的粉丝,遗憾的是没有可配置的默认 git pull 选项。不幸的是,顶部答案似乎不适用于现有的签出分支(如果您在拉出一堆存储库后才搜索此答案,则会很痛苦(,迫使您在每个存储库上运行git branch --set-upstream-to=origin/<branch> <branch>
,用于每个现有分支。
为了减少键入的字符数,您可以使用 git 别名来实现对所有分支的速记拉取,您希望在遥控器上使用类似的命名分支。下面是为git pu
创建别名的示例:
git config --global alias.pu '!git pull $(git remote) $(git branch --show-current)'
现在每次你键入git pu
,它都会自动展开为完整的拉动命令。
shell 扩展非常强大,如果您更喜欢使用 git pull
,您也可以创建一个别名来快速更新远程分支跟踪,例如git up
:
git config --global alias.up '!git branch --set-upstream-to=$(git remote)/$(git branch --show-current) $(git branch --show-current)'
此外,如果您要进入.gitconfig
文件并进行一点更改,则可以将其设置为自动假定您要从任何项目中的当前分支推送/拉取。因此,请在您想要的任何编辑器中打开.gitconfig
。并找到 [push] 选项,将其设置为 default=simple
,如下所示。
[push]
default = simple
[pull]
default = simple
诸如此类。将拉动也更改为简单。两者现在可能都设置为当前。从本质上讲,它与我之前发布的选项完全相同:
git config --global pull.default current
但我发现这是一个更好的选择。因此,您可以使用同一行,但current
更改为 simple
。
此命令应将 git 配置为拉取到当前分支。在终端/iTerm中运行时。
git config --global push.default current
我认为您可以将"推">更改为"拉"以获得与"推"相同的效果。