Git分支学习

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并不会自动更新。

 

posted @ 2022-08-20 18:15  lypbendlf  阅读(74)  评论(0编辑  收藏  举报