1.将本地和远程分支建立映射关系
转自:https://lhajh.github.io/git/2017/01/20/git-local-branch-and-remote-branch-establish-mapping-relationship.html
建立本地分支与远程分支的映射关系(或者为跟踪关系 track)。这样使用 git pull
或者 git push
时就不必每次都要指定从远程的哪个分支拉取合并和推送到远程的哪个分支了。
% git branch -vv * dev 594e046 initial commit master 594e046 [origin/master] initial commit
目前dev还没有和远程分支建立关系,先在拉取的裸仓库建立一下dev分支,
myproj.git % git branch dev
再在本地拉取一下,
git_test % git pull
* [new branch] dev -> origin/dev
说明将远程的dev分支拉取后名字变为origin/dev,下面给dev建立映射关系,
git_test % git branch -a //查看所有分支,当前所在分支为dev * dev master remotes/origin/HEAD -> origin/master remotes/origin/dev remotes/origin/master //将当前分支dev映射到远程的dev分支,设置上游用于pull/push git_test % git branch --set-upstream-to origin/dev Branch 'dev' set up to track remote branch 'dev' from 'origin'.
//已建立映射关系 git_test % git branch -vv * dev 594e046 [origin/dev] initial commit master 594e046 [origin/master] initial commit
下面可取消映射关系,
git_test % git branch --unset-upstream
本地分支和远程分支可以不同名。比如本地的master也可以设置上游映射分支为dev,想怎么映射怎么映射。
1.1 查看远程分支
https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320
要查看远程库的信息,远程仓库的默认名称是origin
git_test % git remote
origin
用git remote -v
显示更详细的信息:
git_test % git remote -v origin git@deMacBook-Pro-2.local:/Users/git/myproj/myproj.git (fetch) origin git@deMacBook-Pro-2.local:/Users/git/myproj/myproj.git (push)
显示了可以抓取和推送的origin
的地址。如果没有推送权限,就看不到push的地址。
2.查看分支来自哪个分支
//这个还不太懂。
git_test % git switch dev Switched to branch 'dev' git_test % git reflog show dev 594e046 (HEAD -> dev, origin/master, origin/dev, origin/HEAD, master) dev@{0}: branch: Created from HEAD git_test % git reflog show master 594e046 (HEAD -> dev, origin/master, origin/dev, origin/HEAD, master) master@{0}: clone: from MacBook-Pro-2.local:/Users/git/myproj/myproj.gi
括号内的都一样?第一项是指当前分支,其他都看不太懂。最后是来源,dev是从HEAD创建的,master是clone的远程仓储。
3.在不同分支提交
git_test % git status On branch dev Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: a.txt
在dev分支上修改文件,并且add commit,
git_test % git commit -m 'branch dev' git_test % cat a.txt testA testB 202208 在bg2的dev分支做修改:)
在dev分支上可查看内容如上,切换到master分支,
git_test % git switch master git_test % cat a.txt testA testB
是看不到刚才的提交的!可以在master分支下,将dev合并过来,其实就是将master指针dev,
git_test % git merge dev Updating 594e046..8aca4e9 Fast-forward a.txt | 1 + 1 file changed, 1 insertion(+)
具体原理参考https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424
新创建dev并且commit后,形势如下:
合并之后如下,
合并之后,可以删除dev分支,删除dev
分支就是把dev
指针给删掉。
git branch -d 分支名 git branch 你的分支名 SHA1值 //删除后恢复分支
4.分支冲突
https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344
git_test % git switch -c feature1 //修改a.txt git_test % git add a.txt git_test % git commit -m 'feature1 a.txt' //在master分支做同样的事情, git_test % git switch master //修改a.txt git_test % git add . git_test % git commit -m 'master a.txt' //在master合并feature1分支,有冲突 git_test % git merge feature1 Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. //通过status命令也能看到冲突 //查看a.txt内容 git_test % cat a.txt testA testB 202208 在bg2的dev分支做修改:) <<<<<<< HEAD 20220820 在bg2的master分支上修改 ======= 20220820 在bg2的feature1分支上修改:> >>>>>>> feature1
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,手动修改txt文件后,再次重新add,
git_test % git add a.txt git_test % git commit -m "feature1 master conflict" git_test % git log --graph //查看分支合并图 * commit 9dbc9cf689a4e7ab3f690186bd1be87677a1d5bb (HEAD -> master) |\ Merge: 4d1e39a 6a58ca6 | | Author: bg <bg@123.com> | | Date: Sat Aug 20 23:35:16 2022 +0800 | | | | feature1 master conflict | | | * commit 6a58ca69ee3b06d762a63e27aab74c641b6eabde | | Author: bg <bg@123.com> | | Date: Sat Aug 20 23:30:38 2022 +0800 | | | | feature1 a.txt | | * | commit 4d1e39a456d8f54c86ee81f47dc139df32cf3e02 |/ Author: bg <bg@123.com> | Date: Sat Aug 20 23:31:42 2022 +0800 | | master a.txt |
可以看到有两次冲突提交了。合并之前,
合并之后,
然后在master分支上查看,
testA testB 202208 在bg2的dev分支做修改:) 20220820 在bg2的master分支上修改 20220820 在bg2的feature1分支上修改:>
在feature1分支上查看,
testA testB 202208 在bg2的dev分支做修改:) 20220820 在bg2的feature1分支上修改:>
master指向的是最新版本,feature1并不会自动更新。