linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

发布于 2018-05-18  213 次阅读


本地分支的管理

[root@am-01:~#] cd /data/gitroot/

[root@am-01:/data/gitroot#] git branch

* master

#查看分支,星号(*)表示当前所在的分支
[root@am-01:/data/gitroot#] git branch am

[root@am-01:/data/gitroot#] git branch

  am

* master

#创建分支
[root@am-01:/data/gitroot#] git checkout am

切换到分支 'am'

[root@am-01:/data/gitroot#] git branch

* am

  master

#切换分支
[root@am-01:/data/gitroot#] vim 2.txt

SDFGHJKL

[root@am-01:/data/gitroot#] git add 2.txt

[root@am-01:/data/gitroot#] git commit -m "add 2.txt"

[am b96754d] add 2.txt

 1 file changed, 1 insertion(+)

 create mode 100644 2.txt

[root@am-01:/data/gitroot#] ls

1.txt  2.txt

[root@am-01:/data/gitroot#] git checkout master

切换到分支 'master'

[root@am-01:/data/gitroot#] ls

1.txt

#在 am 分支下创建一个文件 2.txt,返回 master 分支,查询可见是没有这个文件的,说明分支间相互独立

本地分支的合并

[root@am-01:/data/gitroot#] git checkout master

切换到分支 'master'

[root@am-01:/data/gitroot#] git merge am

更新 2104f2d..b96754d

Fast-forward

 2.txt | 1 +

 1 file changed, 1 insertion(+)

 create mode 100644 2.txt

[root@am-01:/data/gitroot#] ls

1.txt  2.txt

#把 am 分支合并到 master 分支
[root@am-01:/data/gitroot#] vim 2.txt

SDFGHJKL

sdfsfdsads

[root@am-01:/data/gitroot#] git add 2.txt

[root@am-01:/data/gitroot#] git commit -m "2.txt 01"

[master 5685050] 2.txt 01

 1 file changed, 1 insertion(+)

[root@am-01:/data/gitroot#] git checkout am

切换到分支 'am'

[root@am-01:/data/gitroot#] vim 2.txt

SDFGHJKL

f5f4fv1fv5v1

[root@am-01:/data/gitroot#] git add 2.txt

[root@am-01:/data/gitroot#] git commit -m "2.txt 01"

[am 706d4f2] 2.txt 01

 1 file changed, 1 insertion(+)

[root@am-01:/data/gitroot#] git checkout master

切换到分支 'master'

[root@am-01:/data/gitroot#] git merge am

自动合并 2.txt

冲突(内容):合并冲突于 2.txt

自动合并失败,修正冲突然后提交修正的结果。

#两个文件的内容不一样,产生冲突,无法合并
[root@am-01:/data/gitroot#] cat 2.txt

SDFGHJKL

<<<<<<< HEAD

sdfsfdsads

=======

f5f4fv1fv5v1

>>>>>>> am

[root@am-01:/data/gitroot#] vim 2.txt

SDFGHJKL

sdfsfdsads

f5f4fv1fv5v1

[root@am-01:/data/gitroot#] git add 2.txt

[root@am-01:/data/gitroot#] git commit -m "2.txt 02"

[master f46154e] 2.txt 02

[root@am-01:/data/gitroot#] git checkout  am

切换到分支 'am'

[root@am-01:/data/gitroot#] git merge master

更新 706d4f2..f46154e

Fast-forward

 2.txt | 1 +

 1 file changed, 1 insertion(+)

[root@am-01:/data/gitroot#] cat 2.txt

SDFGHJKL

sdfsfdsads

f5f4fv1fv5v1

#做取舍,编辑 master 中冲突的文件内容,保留你需要的内容,并重新提交,这时 master 分支的 2.txt 就是最新的版本了

#如果还是需要两个分支的 2.txt 一致,则需要切换到 am 分支,并把 master 分支合并到 am 分支,这样就能保持 2.txt 一致了
[root@am-01:/data/gitroot#] git checkout master

切换到分支 'master'

[root@am-01:/data/gitroot#] git branch -d am

已删除分支 am(曾为 f46154e)。

#删除 am 分支,如果两边分支不一致,则会提示是否合并,把-d 换成-D,则强制删除,不提示是否合并

使用分支的原则

对于分支的应用,建议大家以这样的原则来:

master 分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。

创建一个 dev 分支,专门用作开发,只有当发布到线上之前,才会把 dev 分支合并到 master

开发人员应该在 dev 的基础上再分支成个人分支,个人分支(在自己 pc 上)里面开发代码,然后合并到 dev 分支

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

远程分支管理

github 上新建一个分支

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

[root@am-01:/data/gitroot#] cd /tmp/

[root@am-01:/tmp#] git clone git@github.com:runfali/Test.git

[root@am-01:/tmp#] git clone git@github.com:runfali/Test.git

正克隆到 'Test'...

remote: Counting objects: 12, done.

remote: Compressing objects: 100% (8/8), done.

remote: Total 12 (delta 0), reused 9 (delta 0), pack-reused 0

接收对象中: 100% (12/12), done.

#把远程仓库克隆到本机
[root@am-01:/tmp#] cd Test/

[root@am-01:/tmp/Test#] git branch

* master

#查看本地分支只能见到 master 分支,这是因为克隆远程仓库只能克隆 master 分支
[root@am-01:/tmp/Test#] git ls-remote origin

27fa564f1de128d583bb88ee1e482783769b3e2f HEAD

27fa564f1de128d583bb88ee1e482783769b3e2f refs/heads/am

27fa564f1de128d583bb88ee1e482783769b3e2f refs/heads/master

#查看远程分支
[root@am-01:/tmp/Test#] git checkout -b am origin/am

分支 am 设置为跟踪来自 origin 的远程分支 am。

切换到一个新分支 'am'

[root@am-01:/tmp/Test#] git branch

* am

  master

#切换到 am 分支,在这时会把 am 分支也克隆下来
[root@am-01:/tmp/Test#] vim 2.txt

dsadsadasdasdadsa

[root@am-01:/tmp/Test#] git add 2.txt

[root@am-01:/tmp/Test#] git commit -m "add 2.txt"

[am 0dd17d0] add 2.txt

 1 file changed, 1 insertion(+)

 create mode 100644 2.txt

[root@am-01:/tmp/Test#] git push

Counting objects: 4, done.

Delta compression using up to 2 threads.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 300 bytes | 0 bytes/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To git@github.com:runfali/Test.git

   27fa564..0dd17d0  am -> am

#因为在本机已经切换到了 am 分支并且在本机 am 分支下修改了文件,所以推送的时候会把更改推送到远程仓库的 am 分支

小知识

对于 git push 分支分两种情况:

当本地分支和远程分支一致时

git push 会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用 git push origin branch-name

当本地分支比远程分支多,默认 git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用 git push origin branch-name,如果推送失败,先用 git pull 抓取远程的新提交,再使用 git push origin branch-name 推送指定分支

标签管理

标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态

一般情况下,打标签都是用在 master 分支上

[root@am-01:/tmp/Test#] git checkout master

切换到分支 'master'

[root@am-01:/tmp/Test#] git tag v1.0

[root@am-01:/tmp/Test#] git tag

v1.0

#给 master 分支打标签,并查看当前分支下都有哪些标签
[root@am-01:/tmp/Test#] git show v1.0

commit 27fa564f1de128d583bb88ee1e482783769b3e2f

Author: runfali <39327978+runfali@users.noreply.github.com>

Date:   Wed May 16 16:07:45 2018 +0800



    Update 1.txt



diff --git a/1.txt b/1.txt

index cd72959..c35ea6f 100644

--- a/1.txt

+++ b/1.txt

@@ -1,2 +1,3 @@

 321456987

 asdbvedfdef

+撒开角度考虑时间空间撒开静安寺街道

[root@am-01:/tmp/Test#] git log --pretty=oneline

27fa564f1de128d583bb88ee1e482783769b3e2f Update 1.txt

91ed5ee9728bd846825eb343fa021805a0be02f5 1.txt 01

d5288b51dd7c8d8fb5fc906641841c2893b7e93e add 1.txt

14cb6096588b4d26fe948456ec06ef278c841eb2 first commit

#查询指定标签的信息,可以看出,标签针对的是 commit,并且默认是为最新版本的 commit 打标签
[root@am-01:/tmp/Test#] git tag v0.8 d5288b51

[root@am-01:/tmp/Test#] git tag

v0.8

v1.0

[root@am-01:/tmp/Test#] git show v0.8

commit d5288b51dd7c8d8fb5fc906641841c2893b7e93e

Author: am <runfali@outlook.com>

Date:   Wed May 16 23:25:07 2018 +0800



    add 1.txt



diff --git a/1.txt b/1.txt

new file mode 100644

index 0000000..99698e7

--- /dev/null

+++ b/1.txt

@@ -0,0 +1 @@

+321456987

#给指定的 commit 版本打标签
[root@am-01:/tmp/Test#] git log --pretty=oneline --abbrev-commit

27fa564 Update 1.txt

91ed5ee 1.txt 01

d5288b5 add 1.txt

14cb609 first commit

#查询各版本的 commit,这里显示的是简写的 commit
[root@am-01:/tmp/Test#] git tag -a v0.1 -m "one tag" 14cb609

[root@am-01:/tmp/Test#] git show v0.1

tag v0.1

Tagger: am <runfali@outlook.com>

Date:   Fri May 18 00:09:37 2018 +0800



one tag



commit 14cb6096588b4d26fe948456ec06ef278c841eb2

Author: am <runfali@outlook.com>

Date:   Wed May 16 23:17:49 2018 +0800



    first commit



diff --git a/README.md b/README.md

new file mode 100644

index 0000000..8ae0569

--- /dev/null

+++ b/README.md

@@ -0,0 +1 @@

+# Test

#打标签的时候对标签做一个描述
[root@am-01:/tmp/Test#] git tag -d v0.1

已删除 tag 'v0.1'(曾为 df30164)

#删除指定标签
[root@am-01:/tmp/Test#] git push origin v1.0

Total 0 (delta 0), reused 0 (delta 0)

To git@github.com:runfali/Test.git

 * [new tag]         v1.0 -> v1.0

#推送指定标签到远程仓库
[root@am-01:/tmp/Test#] git push --tags origin

Total 0 (delta 0), reused 0 (delta 0)

To git@github.com:runfali/Test.git

 * [new tag]         v0.8 -> v0.8

#把所有标签都推送到远程仓库

远程仓库查看推送过来的标签

对应的标签有其对应的 commit 版本的文件

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

[root@am-01:/tmp/Test#] git tag -d v0.8

已删除 tag 'v0.8'(曾为 d5288b5)

[root@am-01:/tmp/Test#] git push origin :refs/tags/v0.8

To git@github.com:runfali/Test.git

 - [deleted]         v0.8

#删除指定标签,并把远程仓库的指定标签也删除

检查远程仓库是否已删除

linux 学习笔记-088-代码管理平台-git 分支管理及远程分支管理,git 标签管理,git 别名

git 别名

git commit 这个命令是不是有点长?用别名可以提高我们的工作效率

[root@am-01:/tmp/Test#] git config --global alias.ci commit

[root@am-01:/tmp/Test#] vim 3.txt

kjasdjaskjdasjdkasj

[root@am-01:/tmp/Test#] git add 3.txt

[root@am-01:/tmp/Test#] git ci -m "3.txt 01"

[master d943610] 3.txt 01

 1 file changed, 1 insertion(+)

 create mode 100644 3.txt

#把 commit 的别名设置为 ci
[root@am-01:/tmp/Test#] git config --global alias.br branch

[root@am-01:/tmp/Test#] git br

  am

* master

#把 branch 的别名设置为 br
[root@am-01:/tmp/Test#] git config --list | grep alias

alias.ci=commit

alias.br=branch

#查询别名对应的命令
[root@am-01:/tmp/Test#] git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

[root@am-01:/tmp/Test#] git lg

* d943610 - (HEAD, master) 3.txt 01 (4 分钟之前) <am>

* 27fa564 - (tag: v1.0, origin/master, origin/HEAD) Update 1.txt (33 小时之前) <runfali>

* 91ed5ee - 1.txt 01 (25 小时之前) <am>

* d5288b5 - add 1.txt (26 小时之前) <am>

* 14cb609 - first commit (26 小时之前) <am>

#利用别名查询 log 小技巧(颜色区分,显示工整清晰)
[root@am-01:/tmp/Test#] git config --global --unset alias.br

[root@am-01:/tmp/Test#] git br

git:'br' 不是一个 git 命令。参见 'git --help'。



您指的是这其中的某一个么?

branch

var

[root@am-01:/tmp/Test#] git branch

  am

* master

#取消指定的别名