运维开发网

git分支管理,标签管理,git别名,搭建git服务器

运维开发网 https://www.qedev.com 2021-03-01 14:43 出处:51CTO 作者:六六天一
Git分支管理几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。有人把Git的分支模型称为必杀技特性,而正是因为它,将Git从版本控制系统家族里区分出来。创建分支命令:gitbranch(branchname)切换分支命令:gitcheckout(branchname)创建分支并切换到新创建的分支gitcheckout-b(bra

Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有人把 Git 的分支模型称为必杀技特性,而正是因为它,将Git从版本控制系统家族里区分出来。

创建分支命令:

git branch (branchname)

切换分支命令:

git checkout (branchname)

创建分支并切换到新创建的分支

git checkout -b (branchname)

[root@jinkai newfile]# git branch

* main

[root@jinkai newfile]# git branch admin

[root@jinkai newfile]# git branch

admin

* main

[root@jinkai newfile]# git checkout admin

切换到分支 'admin'

[root@jinkai newfile]# git branch

* admin

main

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

但git add添加到库里面的时候,每个分支的内容是单独的,如下admin分支添加了1.txt,切回main分支下查看没有

[root@jinkai newfile]# git checkout admin

切换到分支 'admin'

[root@jinkai newfile]# echo 11111 > 1.txt

[root@jinkai newfile]# git add 1.txt

[root@jinkai newfile]# git commit -m "touch 1.txt"

[admin 13f3b30] touch 1.txt

1 file changed, 1 insertion(+)

create mode 100644 1.txt

[root@jinkai newfile]# ls

1.txt a.txt README.md

[root@jinkai newfile]# git checkout main

切换到分支 'main'

[root@jinkai newfile]# ls

a.txt README.md

分支的合并:

合并分支之前,先切换到目标分支,把admin分支合并到了main

[root@jinkai newfile]# git checkout main

已经位于 'main'

[root@jinkai newfile]# git merge admin

更新 957bc21..13f3b30

Fast-forward

1.txt | 1 +

1 file changed, 1 insertion(+)

create mode 100644 1.txt

合并产生的冲突:

如果admin分支和main分支都对a.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。

解决冲突的方法是在main分支下,编辑a.txt,改为admin分支里面a.txt的内容。 然后提交a.txt,再合并admin分支。

[root@jinkai newfile]# git merge admin

自动合并 a.txt

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

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

[root@jinkai newfile]# cat a.txt

aaaa

<<<<<<< HEAD

mainmainmainmain

=======

mainmainmain

adminadminadmin

\>>>>>>> admin

[root@jinkai newfile]# vim a.txt

[root@jinkai newfile]# git add a.txt

[root@jinkai newfile]# git commit -m "main file a.txt"

[main 7baca4e] main file a.txt

[root@jinkai newfile]# git merge admin

Already up-to-date.

但是这样有一个问题,万一main分支更改的内容是我们想要的呢? 可以编辑a.txt内容,改为想要的,然后提交。切换到admin分支,然后合并main分支到admin分支即可(倒着合并)。

[root@jinkai newfile]# git checkout admin

切换到分支 'admin'

[root@jinkai newfile]# git merge main

更新 3445592..f2828c2

Fast-forward

a.txt | 1 -

1 file changed, 1 deletion(-)

[root@jinkai newfile]# cat a.txt

aaaa

mainmainmain

合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。

删除分支:

git branch -d admin

如果分支没有合并,删除之前会提示,那就不合并,强制删除

git branch -D admin

恢复被删除的分支:

Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。

因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支:

git branch <branch_name> <hash_val>

如果我们不知道想要恢复的分支的散列值,可以用reflog命令将它找出来。如:

[root@jinkai newfile]# git branch -d admin

已删除分支 admin(曾为 ca5f319)。

[root@jinkai newfile]# git branch admin HEAD@{0}

git分支管理,标签管理,git别名,搭建git服务器

reflog**命令**:

显示整个本地仓储的commit,包括所有branch的commit,甚至包括已经撤销的commit。

只要HEAD发生了变化, 就会在reflog里面看得到。

这时恢复分支a_branch分支如下:

git branch admin HEAD@{0}

使用分支的原则:

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

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

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

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

dev分支合并bob分支的命令是:

[root@jinkai newfile]# git checkout dev

切换到分支 'dev'

[root@jinkai newfile]# git merge bob

Already up-to-date.

[root@jinkai newfile]# git checkout main

切换到分支 'main'

[root@jinkai newfile]# git merge dev

Already up-to-date.

远程分支管理

本地新建的分支如果不推送到远程,对其他人就是不可见的

查看远程分支:

git ls-remote origin

[root@jinkai newfile]# git ls-remote origin

f2828c2b54dfd986da7a8798733b19bf82793145 HEAD

f2828c2b54dfd986da7a8798733b19bf82793145 refs/heads/main

对于git push分支分两种情况

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

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

[root@jinkai newfile]# git push origin admin

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

remote:

remote: Create a pull request for 'admin' on GitHub by visiting:

remote: https://github.com/jinkai-Linux/newfile/pull/new/admin

remote:

To https://github.com/jinkai-Linux/newfile.git

* [new branch] admin -> admin

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

git clone的时候默认只把main分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称要一致

git分支管理,标签管理,git别名,搭建git服务器

git分支管理,标签管理,git别名,搭建git服务器

报错:

[root@jinkai newfile]# git checkout -b dev origin/dev

fatal: Cannot update paths and switch to branch 'dev' at the same time.

Did you intend to checkout 'origin/dev' which can not be resolved as commit?

解决方法一:

创建本地分支

git checkout -b dev

然后重置他的起始点

git reset --hard origin/dev

运行git fetch origin,运行前确保远程端dev分支确实存在。

[root@jinkai newfile]# git branch

admin

* dev

main

解决方法二:

git remote show origin
git remote update
git fetch

git checkout -b dev origin/dev

标签管理

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

git checkout main //先切到main分支上

git tag v1.0 //给main打一个标签v1.0

git show v1.0 //查看标签信息

git tag //可以查看所有的标签

tag是针对commit来打标签的,所以可以针对历史的commit来打tag

git log --pretty=oneline --abbrev-commit //先查看历史的commit

git tag v0.9 f60f5d1 //针对历史commit打标签

git tag -a v0.8 -m "tag just v1.1 and so on" 1cdb957 //可以对标签进行描述

git tag -d v0.8 //删除标签

git push origin v1.0 //推送指定标签到远程

git push --tag origin //推送所有标签

如果本地删除了一个标签,远程也想要删除需要这样操作:

git tag v1.0 -d //删除本地标签

git push origin :refs/tags/v1.0 //删除远程标签

[root@jinkai newfile]# git tag v1.0

[root@jinkai newfile]# git show v1.0

commit f2828c2b54dfd986da7a8798733b19bf82793145

Author: root <root@jinkai.1>

Date: Sun Dec 13 00:08:24 2020 +0800

main file a.txt

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

index 1383736..384c402 100644

--- a/a.txt

+++ b/a.txt

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

aaaa

mainmainmain

-adminadminadmin

[root@jinkai newfile]# git tag

v1.0

[root@jinkai newfile]# git log --pretty=oneline --abbrev-commit

f2828c2 main file a.txt

7baca4e main file a.txt

61ecf5b main file a.txt

3445592 admin file a.txt

269659a main file a.txt

13f3b30 touch 1.txt

957bc21 wowowo

f60f5d1 whowhowho

1cdb957 wowowo

c36e391 Update a.txt

d3b0dc5 new file a.txt

ca5f319 admin file a.txt

f701012 Update README.md

14cef13 Update README.md

f278ae1 first commit

[root@jinkai newfile]# git tag v0.9 f60f5d1

[root@jinkai newfile]# git tag -a v0.8 -m "tag just v1.1 and so on" 1cdb957

[root@jinkai newfile]# git tag

v0.8

v0.9

v1.0

[root@jinkai newfile]# git tag -d v0.8

Deleted tag 'v0.8' (was 16b3de5)

[root@jinkai newfile]# git push origin v1.0

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

To https://github.com/jinkai-Linux/newfile.git

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

[root@jinkai newfile]# git push --tag origin

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

To https://github.com/jinkai-Linux/newfile.git

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

[root@jinkai newfile]# git tag v0.9 -d

Deleted tag 'v0.9' (was f60f5d1)

[root@jinkai newfile]# git push origin :refs/tags/v0.9

To https://github.com/jinkai-Linux/newfile.git

- [deleted] v0.9

git别名

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

git config --global alias.ci commit //ci 是别名 commit是原命令

git config --global alias.co checkout

git config --global alias.br branch

查看git别名使用命令

git config --list |grep alias

查询log小技巧:

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"

取消别名

git config --global --unset alias.br

查看别名配置文件

cat /root/.gitconfig

[root@jinkai newfile]# git config --global alias.ci commit

[root@jinkai newfile]# git config --global alias.co checkout

[root@jinkai newfile]# git config --global alias.br branch

[root@jinkai newfile]# git config --list |grep alias

alias.ci=commit

alias.co=checkout

alias.br=branch

[root@jinkai newfile]# 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@jinkai newfile]# git lg

* f2828c2- (HEAD, tag: v1.0, origin/main, origin/admin, main, admin) main file a.txt (21 hours ago) <root

* 7baca4e- main file a.txt (21 hours ago) <root>

|\

| * 3445592- admin file a.txt (21 hours ago) <root>

-------------------------------------------------------

[root@jinkai newfile]# git config --global --unset alias.br

[root@jinkai newfile]# git config --list |grep alias

alias.ci=commit

alias.co=checkout

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@jinkai newfile]# cat /root/.gitconfig

[user]

name = root

email = root@jinkai.1

[push]

default = matching

[alias]

ci = commit

co = checkout

lg = log --color --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commi

搭建git服务器

github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器

找一台服务器,首先要安装git,yum install -y git

添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆

useradd -s /usr/bin/git-shell git

cd /home/git

创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥

mkdir .ssh

touch .ssh/authorized_keys

chown -R git:git .ssh

chmod 600 .ssh/authorized_keys

定好存储git仓库的目录,比如 /data/gitroot

mkdir /data/gitroot

cd /data/gitroot

git init --bare sample.git // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾

chown -R git:git sample.git

以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的

首先要把客户端上的公钥放到git服务器上/home/git/.ssh/authorized_keys文件里

在客户端上(自己pc)克隆远程仓库

git clone git@ip:/data/gitroot/sample.git

此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程

仓库了。进入到这里面,可以开发一些代码,然后push到远程,也可以到服务器上clone到客户端。

[root@jinkai05 ~]# yum install -y git

[root@jinkai05 ~]# useradd -s /usr/bin/git-shell git

[root@jinkai05 ~]# cd /home/git/

[root@jinkai05 git]# mkdir .ssh

[root@jinkai05 git]# touch .ssh/authorized_keys

[root@jinkai05 git]# chown -R git:git .ssh

[root@jinkai05 git]# chmod 600 .ssh/authorized_keys

[root@jinkai05 git]# mkdir /data/gitroot

[root@jinkai05 git]# cd !$

cd /data/gitroot

[root@jinkai05 gitroot]# git init --bare sample.git

初始化空的 Git 版本库于 /data/gitroot/sample.git/

[root@jinkai05 gitroot]# chown -R git:git sample.git/

[root@jinkai05 gitroot]# vim /home/git/.ssh/authorized_keys

[root@jinkai05 gitroot]# cat !$

cat /home/git/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDsGH9A1mo0IRXhrBsWO9Zpkv45nJT14tYQhPt6BEN/17VPESvHVP0Ur0cVIG571Nh1yyCcLBzInDsR4UVRrexUp6j7NNXv9qA/89DomYFp3W67WLch2fa4WkX2xeKxoZR0RJpnQK0NS5EOhe9vrI5aAJe/OsVOfMoHB8HJI/rPsS9mLmOG+PVSmQzokF4DYRmOXB/+eZ0H0Rwoy8W87WF269yliaQQMPsGgJK+1kYhqIkEk80fEE6kGd1ZR0gSLoYYXrmSVhOhLis3TKGQLe4UqpuuV95MFmcaT1yvUVnuAqNRjmxs/hia6htySbGibcF4OmjKQU+ZFh2q+Sk1Xx147OsiT3w9WPd+QQTHvDWlN1QyPER7elSf65mcuX8QFz1WB/gv+sQ+qNwd+9C2xV5WtacD+1/QU6XQOD48mKl3VbazJoZ8K0DTYmqsm+J9Y2QuuXQ8iLBNH0zvxh3zBGpdd140q8VitAxbGA98aiXURA2D+jatlEZKMmKPlCu4JuGdsTsTex+na9+Wi0/PthfIkzcDjMFNoRHMkMhBJfTz2t/bOW4EgDBni0JrP66JHIMg9s2QN0O1fRtEQzcimT3FpndhYDgrM4b1G+4K41oE+rj9tAe7sVSG2afxbDY4p53988Oze9lxPwPE2+JT8z+ztRlfCRZqm0o3BVzclQ8G4w== root@jinkai.1

[root@jinkai newfile]# git clone git@192.168.111.140:/data/gitroot/sample.git

Cloning into 'sample'...

The authenticity of host '192.168.111.140 (192.168.111.140)' can't be established.

ECDSA key fingerprint is SHA256:GnZadcz8FK3PLcgNXjhMWbz0Qgqi2LvbqaoR+wLdV9Q.

ECDSA key fingerprint is MD5:00:10:2a:88:19:39:d4:58:7d:7a:22:0d:03:bb:82:0a.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.111.140' (ECDSA) to the list of known hosts.

warning: You appear to have cloned an empty repository.

[root@jinkai newfile]# ls

1.txt README.md a.txt sample

[root@jinkai sample]# echo aaaaa > a.txt

[root@jinkai sample]# git add a.txt

[root@jinkai sample]# git commit -m "ch a.txt"

[master (root-commit) d75b190] ch a.txt

1 file changed, 1 insertion(+)

create mode 100644 a.txt

[root@jinkai sample]# git push

No refs in common and none specified; doing nothing.

Perhaps you should specify a branch such as 'master'.

fatal: The remote end hung up unexpectedly

error: failed to push some refs to 'git@192.168.111.140:/data/gitroot/sample.git'

[root@jinkai sample]# git push origin master

Counting objects: 3, done.

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

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

To git@192.168.111.140:/data/gitroot/sample.git

* [new branch] master -> master

[root@jinkai sample]# cd /tmp/

[root@jinkai tmp]# git clone git@192.168.111.140:/data/gitroot/sample.git

Cloning into 'sample'...

remote: Counting objects: 3, done.

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

Receiving objects: 100% (3/3), done.

[root@jinkai tmp]# ls sample/

a.txt

[root@jinkai tmp]# cat sample/a.txt

aaaaa

0

精彩评论

暂无评论...
验证码 换一张
取 消