Git:如何确保新分支基于上游主分支

15
我一直在使用GitHub时犯了很多初学者错误,因此我正在寻找一种绝对可靠的(适合自己的!)方法来确保:
a) 我在派生分支上创建的所有新分支都基于原始主分支,而不是其他分支,以及...
b) 我的原始主分支始终与上游主分支保持最新,以及...
c) 当/在提交(推送?)之前,我的更改将被重新基于上游主分支。
以下是我目前的做法...
要创建新分支:
git fetch --all --tag
git pull upstream master
git push origin master
git checkout -b my_branch_name -t origin/master

将我的更改存储到该分支中:

git add -A
git commit -m "Summary of what changed"
git fetch --all --tag
git pull --rebase upstream master
git push origin my_branch_name

在以后的日期加载现有分支(例如,根据PR反馈进行一些其他更改):

git fetch --all --tag
git pull upstream master
git push origin master
git checkout my_branch_name -t origin/master

然后保存我的更新到该分支:

git add -A
git commit --amend --no-edit
git fetch --all --tag
git pull --rebase upstream master
git push origin my_branch_name -f

我必须承认,我并不完全理解这些命令的作用 - 似乎有很多类似的方式可以做很多类似的事情,尽管我已经搜索/阅读了很多,但我仍然是个新手。

非常感谢任何指导!


1
git pull --rebase upstream master 后跟 git push origin my_branch_name 通常不起作用,因为您正在重写 my_branch_name 的历史记录。相反,您需要通过 git push --force origin my_branch_name 强制推送您的分支。 - Tim Biegeleisen
你能把你的问题具体化吗? - Tim Biegeleisen
@TimBiegeleisen 我最关心的是如何确保我创建的任何新分支(或打开的现有分支)都是基于主分支而不是其他分支。这是我最大的痛点,我总是不知怎么地创建了基于之前分支而不是主分支的分支。 - cabbageforall
1
这是一个常见的错误,即使使用 Git 多年后我自己仍然会犯。只需检出 master 并从那里执行 git branch,就是这么简单。 - Tim Biegeleisen
1
“checkout master” 是否会是最新的上游主分支?(由于某种原因,我的本地主分支似乎总是与上游主分支不同步) - cabbageforall
4个回答

17

设置上游之后

git checkout -b branch-name
git fetch upstream
git reset --hard upstream/master
git push --set-upstream origin branch-name

1
如果没有上游,请尝试执行以下操作: git remote add upstream YourUpstreamUrl - Ali Yousefi

6
如果upstream master指的是服务器/远程最新的主分支,您可以运行以下命令创建一个新分支。
git fetch origin master
git checkout -b <new_branch> FETCH_HEAD

如果您不介意在分离的HEAD上工作,也可以运行以下命令:

git fetch origin master
git checkout FETCH_HEAD

3
如果您想保留下游主分支的更改,我建议按照以下步骤操作,以保持下游主分支不变,但在上游主分支上创建一个新分支。
git checkout -b upstream-master
git fetch upstream
git reset --hard upstream/master
git push --set-upstream origin upstream-master

1
我认为第三行应该使用git reset而不是revert,就像Jiburiru的回答中所示。 - rbnvrw

3
要基于“当前”master分支创建一个功能分支,您应该执行以下步骤:
git checkout master                # switches to your local master branch
git pull origin master             # updates remote tracking branch, merges into local master
git checkout -b my_feature_branch  # create a new branch from your updated local master

请注意,GitHub 上的远程 master 分支可能会不断地有新的更改。实际上,你应该通常假设这种情况会发生,并且需要通过合并或变基来处理它。

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