git推送分支学习
转自:https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320
https://www.runoob.com/git/git-push.html
1.push命令
推送分支,就是把该分支上的所有本地提交(commit)推送到远程库。
推送时,要指定本地分支,Git就会把该分支推送到远程库对应的远程分支上:
git push <远程主机名> <本地分支名>:<远程分支名> //如果本地分支名与远程分支名相同,则可以省略: git push <远程主机名> <本地分支名>
例如:
git push origin master //将本地的 master 分支推送到 origin 主机的 master 分支
不同名:
git push origin test:cz/test
将本地的test分支推送到远程作为cz/test分支。
可以通过git branch --set-upstream-to master origin/master 设置分支上游,进行本地与远程分支的关联,方便pull和push。
2.尝试
当push时,如果已经有了其他人先push了同样的文件,会有冲突,那么会有以下问题:
% git push origin master To deMacBook-Pro-2.local:/Users/git/myproj/myproj.git ! [rejected] master -> master (fetch first) error: 无法推送一些引用到 'deMacBook-Pro-2.local:/Users/git/myproj/myproj.git' 提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外 提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。 提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。
那么需要首先pull一下,
myproj % git pull 提示:您有偏离的分支,需要指定如何调和它们。您可以在执行下一次 提示:pull 操作之前执行下面一条命令来抑制本消息: 提示: 提示: git config pull.rebase false # 合并 提示: git config pull.rebase true # 变基 提示: git config pull.ff only # 仅快进 提示: 提示:您可以将 "git config" 替换为 "git config --global" 以便为所有仓库设置 提示:缺省的配置项。您也可以在每次执行 pull 命令时添加 --rebase、--no-rebase, 提示:或者 --ff-only 参数覆盖缺省设置。 fatal: 需要指定如何调和偏离的分支。
但仍然有上述问题,https://juejin.cn/post/7116098741857157157
git pull
相当于 git fetch
(拉取代码) + git merge
/ git rebase
(将提交应用到当前分支)。在拉取代码之后,执行git merge
还是git rebase
,要根据配置来定。
myproj % git config pull.rebase false
之后pull,
myproj % git pull 自动合并 a.txt 冲突(内容):合并冲突于 a.txt 自动合并失败,修正冲突然后提交修正的结果。 @192 myproj % cat a.txt testA testB <<<<<<< HEAD 0820 bg修改一下 ======= 202208 在bg2的dev分支做修改:) 20220820 在bg2的master分支上修改 20220820 在bg2的feature1分支上修改:> >>>>>>> 9dbc9cf6
<<<<<<< HEAD 和 ======= 之间的是本地的最新提交,======= 和9dbc9cf6是远程分支的提交。修改文件后,提交,
myproj % cat a.txt testA testB 0820 bg修改一下 202208 在bg2的dev分支做修改:) 20220820 在bg2的master分支上修改 20220820 在bg2的feature1分支上修改:> 20220823 在bg的master分支上合并冲突 myproj % git add a.txt myproj % git commit -m '处理a.txt冲突' myproj % git push
3.rebase变基
https://juejin.cn/post/7116098741857157157
git rebase 可以把分支的提交放到另一个分支的最新提交的后面(最新)。
C、D、E 依次对应本地dev分支上的提交“新增b.txt文件”、"新增b222"、"新增b333",F、G 依次对应远程dev分支上的提交"新增a444"、"新增a555"。
git rebase origin/dev
将dev分支上的提交放到了origin/dev分支上的提交的后面,C‘、D‘、E’和C、D、E提交包含相同的修改内容,但是它们是不同的提交。
在dev
分支执行git merge origin/dev
会将origin/dev
分支的代码合并到dev
分支。并且会产生一个合并提交H,合并之后,dev
分支就会包含A、B、C、D、E、F、G、H的提交内容。
https://www.jianshu.com/p/6960811ac89c
https://blog.csdn.net/nrsc272420199/article/details/85555911
git checkout master git pull git checkout local git rebase -i HEAD~2 //合并提交 --- 2表示合并两个 git rebase master---->解决冲突--->git rebase --continue git checkout master git merge local git push
rebase -i HEAD~2真能合并两个提交?表示怀疑,好象不行,还是不会用rebase。。还是尽量每次只有一个commit吧。。。
https://www.cnblogs.com/wangiqngpei557/p/6056624.html
https://juejin.cn/post/6844903895160881166
git pull rebase 基本上就是为了解决merge时多出一个无用的commit的问题,那样分支历史不好看。
多人基于同一个远程分支开发的时候,如果想要顺利 push 又不自动生成 merge commit,建议在每次提交都按照如下顺序操作:
# 把本地发生改动的文件贮藏一下 $ git stash # 把远程最新的 commit 以变基的方式同步到本地 $ git pull --rebase # 把本地的 commit 推送到远程 $ git push # 把本地贮藏的文件弹出,继续修改 $ git stash pop