天天看點

代碼管理平台GIT

22.3 GIT

前面有講到過,GIT是分布式的,GIT不需要依賴服務端,在自己的機器上就可以工作。

單機使用GIT

  • 安裝:
# yum install -y git           
  • 初始化倉庫:
# mkdir /data/gitroot && cd /data/gitroot/
 # git init Initialized empty Git repository in /data/gitroot/.git/# ls -latotal 0
drwxr-xr-x 3 root root  18 Aug 31 22:06 .drwxr-xr-x 5 root root  51 Aug 31 22:05 ..drwxr-xr-x 7 root root 119 Aug 31 22:06 .git				#和svn有點類似# ls .git/branches  config  description  HEAD  hooks  info  objects  refs           
  • 上傳檔案:
# vim 1.txt				#随便寫點東西rggjohktrlhm
dkmklwdo3ofker
gjrkghrjlhkgrlh# vim 1.txt# vim .git/config				#添加下面内容,否則下面送出到倉庫會報錯[user]
        name = lzx
        email = [email protected]# git add 1.txt				#添加到倉庫# git commit -m "add 1.txt"				#正式送出到倉庫[master (root-commit) dd8aa2f] add 1.txt
 1 file changed, 3 insertions(+)
 create mode 100644 1.txt           
  • 更改檔案:
# vim 1.txt				#更改1.txtrggjohktrlhm
dkmklwdo3ofker
gjrkghrjlhkgrlh
deihfefufr
absqwjbejwfn# git add 1.txt # git commit -m "add 1.txt agin"				#再次送出[master 70335c6] add 1.txt agin
 1 file changed, 2 insertions(+)# git status				#檢視倉庫狀态# On branch masternothing to commit, working directory clean				#幹淨的工作區,沒有檔案要送出# vim 1.txt				#更改1.txtrggjohktrlhm
dkmklwdo3ofker
gjrkghrjlhkgrlh# git status				#沒有執行add和commit,是以提示我們執行這兩步# On branch master# Changes not staged for commit:#   (use "git add..." to update what will be committed)#   (use "git checkout --..." to discard changes in working directory)##	modified:   1.txt#no changes added to commit (use "git add" and/or "git commit -a")           
  • 對比:
# git diff 1.txt				#檢視變更,将更改後的内容和之前内容作對比diff --git a/1.txt b/1.txt
index be325ea..a42241c 100644
--- a/1.txt
+++ b/1.txt
@@ -1,5 +1,4 @@
 rggjohktrlhm
 dkmklwdo3ofker
 gjrkghrjlhkgrlh
-deihfefufr
-absqwjbejwfn				#顯示我删掉了最後面兩行+           
  • 檢視變更記錄:
# git add 1.txt # git commit -m "add 1.txt agin"[master 129107f] add 1.txt agin
 1 file changed, 1 insertion(+), 2 deletions(-)# git log				#檢視變更記錄commit 129107fc060b196b813d5070b0c80de1f7b450c1
Author: lzx <[email protected]>				#之前修改配置檔案定義的使用者和郵箱Date:   Fri Aug 31 22:29:01 2018 -0400

    add 1.txt agin

commit 70335c6f9906c1e171fbad0a5146fc6084779ee7
Author: lzx <[email protected]>Date:   Fri Aug 31 22:21:07 2018 -0400

    add 1.txt agin

commit dd8aa2f8aed7d30d7163b1e0c49d3f2001e9ea81
Author: lzx <[email protected]>Date:   Fri Aug 31 22:15:26 2018 -0400

    add 1.txt# git log --pretty=oneline				#以一行形式顯示變更記錄129107fc060b196b813d5070b0c80de1f7b450c1 add 1.txt agin
70335c6f9906c1e171fbad0a5146fc6084779ee7 add 1.txt agin
dd8aa2f8aed7d30d7163b1e0c49d3f2001e9ea81 add 1.txt				#-m 指定解釋說明字段,可以在這裡顯示出來,比較重要           
  • 回退版本:
上面的每一行都可以看做是一個版本# git reset --hard 70335c				#回退版本,最後面的字元串可以簡寫HEAD is now at 70335c6 add 1.txt agin# git log --pretty=oneline70335c6f9906c1e171fbad0a5146fc6084779ee7 add 1.txt agin
dd8aa2f8aed7d30d7163b1e0c49d3f2001e9ea81 add 1.txt				#變成兩行了,回退之後最新的版本消失           

假如回退了版本之後又後悔了怎麼辦,如果記得之前最新版本的字元串還可以更改,那如果不記得了怎麼辦?

  • 檢視所有曆史版本:
# git reflog				#檢視所有曆史版本,可以得到之前代表最新版本的字元串70335c6 HEAD@{0}: reset: moving to 70335c
129107f HEAD@{1}: commit: add 1.txt agin
70335c6 HEAD@{2}: commit: add 1.txt agin
dd8aa2f HEAD@{3}: commit (initial): add 1.txt# git reset --hard 129107f				#再回退到最新版本HEAD is now at 129107f add 1.txt agin# git log --pretty=oneline129107fc060b196b813d5070b0c80de1f7b450c1 add 1.txt agin
70335c6f9906c1e171fbad0a5146fc6084779ee7 add 1.txt agin
dd8aa2f8aed7d30d7163b1e0c49d3f2001e9ea81 add 1.txt				#可以看到已經回到了最新版本           

如果不小心把檔案删掉了怎麼辦?

  • 恢複檔案:
# ls1.txt# rm -rf 1.txt # ls# git checkout -- 1.txt				#恢複檔案# ls1.txt           

因為檔案還在git版本庫裡面,是以才可以恢複。

如果檔案作了修改,而且add了,但沒有commit,如何撤銷add,回到送出add前的狀态呢?

  • 回到送出前的狀态:
# vim 1.txt				#更改1.txtrggjohktrlhm
dkmklwdo3ofker
gjrkghrjlhkgrlh
nfbgfrjegbjerk
fejkfnergner
frjgkoerhgi# git add 1.txt # git reset HEAD 1.txt				#撤銷add操作,回到送出前的狀态Unstaged changes after reset:
M	1.txt# git checkout -- 1.txt				#恢複版本庫裡的最新版本,撤銷了修改# cat 1.txt rggjohktrlhm
dkmklwdo3ofker
gjrkghrjlhkgrlh           

從上面可以看出來,每次修改完之後都必須要add和commit,否則版本庫裡不會更新。

  • 删除檔案:
# git rm 1.txt				#在本地删除1.txtrm '1.txt'# ls# git reset HEAD 1.txt				#撤銷del操作,回到删除前的狀态Unstaged changes after reset:
D	1.txt# git checkout -- 1.txt				#恢複1.txt# ls1.txt

真正删除一個檔案# git rm 1.txt				#在本地删除1.txtrm '1.txt'# ls# git commit -m "delete 1.txt"				#從版本庫裡删除1.txt[master b7f069a] delete 1.txt
 1 file changed, 4 deletions(-)
 delete mode 100644 1.txt# git reset HEAD 1.txt # git checkout -- 1.txt				#這樣再想恢複就無法恢複了error: pathspec '1.txt' did not match any file(s) known to git.      

确實想再恢複它# git log --pretty=onelineb7f069a9146fea7e0682266a857708f42ccb460d delete 1.txt
129107fc060b196b813d5070b0c80de1f7b450c1 add 1.txt agin
70335c6f9906c1e171fbad0a5146fc6084779ee7 add 1.txt agin
dd8aa2f8aed7d30d7163b1e0c49d3f2001e9ea81 add 1.txt git reset --hard 129107fc				#通過版本字元串,reset恢複HEAD is now at 129107f add 1.txt agin# ls1.txt# cat 1.txtrggjohktrlhm
dkmklwdo3ofker
gjrkghrjlhkgrlh           

建立遠端倉庫

  1. 浏覽器打開

    www.github.com

    ,新增賬號,建立新的倉庫;
  2. 倉庫名字自定義,選擇public(private收費),點選建立倉庫;
  3. 添加key,右上角點選個人頭像,選擇

    setting

    ,左側選擇

    SSH and GRP keys

    ,然後右側選擇

    New SSH key

  4. 在linux機器上建立SSH公鑰:
# ssh-keygen         Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):				#直接按Enter鍵       Enter passphrase (empty for no passphrase):				#輸入密碼,建議留白Enter same passphrase again:				#确認密碼Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:/jPZgy/prZShxkNduQ1xlOST/pfzYCf2el0JLeQsWCY root@lzx
The key's randomart image is:
+---[RSA 2048]----+|            .o+. ||         E o *.. ||          = B =  ||         o o X o ||        S o o = .||       + . o   oo||        * o=  =o*||       . +B.oo =*||         .+*o..oo|+----[SHA256]-----+# cat .ssh/id_rsa.pub				#檢視公鑰ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqWlFPl3JwzR3AiJgolBthMJradp2r1UekJZnnU5hVjDb+pZ72YQUfNdatuUMr96avQYsF+V61sOc/cxa3YPn35n36TW8P+u7FMxZf31eqMatcHG/AWvjW0UsDw+zQrBr5414mj+AIYQgj0GtDIQJbfifGizK7i9UPLy7oW3Ss7+G2+fqhJ2hIo6qTSBHwSdN3rn9ypL0dPIEqJyaaBUpg5a5JKv3KHO5EyJt6Z787SPf3snKddQNpLkgoQ8yPcbZQ3BE5gt6DapMMpLEUUR2adIfe0rWqcDr4Gp9QTW0u+/LgFI6I1UKdTVYvU2UkpUf4WEp+6Q8AROasXxljrNC1 root@lzx           
  1. 回到浏覽器界面,Title自定義,将linux上公鑰複制在Key中,然後

    Add SSH key

    ,這樣就生成了key,可以讓服務端識别linux用戶端;
  2. 在linux用戶端建立倉庫,随意寫點東西推送到遠端服務端上:
# cd /tmp/# mkdir mylinux && cd mylinux/# echo "# mylinux" >> README.md# git initInitialized empty Git repository in /tmp/mylinux/.git/# ls -latotal 8
drwxr-xr-x   3 root root   35 Sep  1 08:26 .drwxrwxrwt. 12 root root 4096 Sep  1 08:25 ..drwxr-xr-x   7 root root  119 Sep  1 08:26 .git
-rw-r--r--   1 root root   10 Sep  1 08:25 README.md# cd .git/# ls .git/branches  config  description  HEAD  hooks  index  info  objects  refs# vim .git/config				#添加下面内容,身份識别,否則commit報錯[user]
        name = lzx              
        email = [email protected]				#這裡應該填你注冊git時使用的使用者名和郵箱
        # git add README.md# git commit -m "first commit"[master (root-commit) ca836f8] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md 
# git remote add origin https://github.com/Tobewont/mylinux.git#		将目前倉庫中的檔案推送到遠端服務端上# git push -u origin master				#将更改推送到遠端服務端上Username for 'https://github.com': Tobewont				#輸入之前注冊git的使用者名Password for 'https://[email protected]':				#輸入之前注冊git的密碼Counting objects: 3, done.
Writing objects: 100% (3/3), 211 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)To https://github.com/Tobewont/mylinux.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.           

然後在服務端重新整理一下,就可以看到我們推送的内容了。

  1. 上面在 git push時還需要輸入使用者名和密碼,很不友善:
# vim .git/config				#url預設為https位址,修改為SSH位址url = [email protected]:Tobewont/mylinux.git# echo "lzxlzx" > 2.txt# git add 2.txt # git commit -m "add 2.txt"[master 50590ed] add 2.txt
 1 file changed, 1 insertion(+)
 create mode 100644 2.txt 
# git push -u origin masterEnter passphrase for key '/root/.ssh/id_rsa':				#輸入之前生成SSH時輸入的密碼即可,不用再輸入使用者名和密碼Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 266 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)To [email protected]:Tobewont/mylinux.git
   ca836f8..50590ed  master -> master
Branch master set up to track remote branch master from origin.           

克隆遠端倉庫

  • 複制連結:

先在伺服器端倉庫找到

Clone or download

按鈕,複制連結:

[email protected]:Tobewont/mylinux.git

  • 然後在用戶端進行clone:
# cd /home/# lsadmin  myproject# git clone [email protected]:Tobewont/mylinux.git				#git clone進行倉庫克隆Cloning into 'mylinux'...
Enter passphrase for key '/root/.ssh/id_rsa':				#輸入之前配置生成SSH時輸入的密碼,下面類似remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.# lsadmin  mylinux  myproject# ls mylinux/2.txt  README.md           
  • 用戶端更改内容:
# vim mylinux/README.mdaaaaaa
bbbbbb
cccccc# cd mylinux/# git add README.md # git commit -m "change readme.md"[master e38ef1e] change readme.md
 1 file changed, 3 insertions(+)# git push				#推送到服務端Enter passphrase for key '/root/.ssh/id_rsa':Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 283 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)To [email protected]:Tobewont/mylinux.git
   50590ed..e38ef1e  master -> master           

到服務端倉庫檢視,重新整理一下就可以看到剛剛的更改。

代碼管理平台GIT
  • 服務端更改内容:

先在服務端倉庫編輯

README.md

,然後點選

Commit changes

按鈕送出。

代碼管理平台GIT
  • 在用戶端檢視:
# git pull				#從服務端拉取内容Enter passphrase for key '/root/.ssh/id_rsa':remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
From github.com:Tobewont/mylinux
   e38ef1e..c24d9bb  master     -> origin/master
Updating e38ef1e..c24d9bb
Fast-forward
 README.md | 4 ++++
 1 file changed, 4 insertions(+)# cat README.md # mylinuxaaaaaa
sn
ek
rk
gt				#可以看到剛剛的更改bbbbbb
cccccc           

本地分支管理

  • 檢視分支:
# cd /data/gitroot/# ls1.txt# git branch				#檢視分支* master				#目前處于master分支           
  • 建立分支:
# git branch lzx				#建立分支# git branch
  lzx
* master				#* 号表示目前處于哪一分支           
  • 切換分支:
# git checkout lzx				#切換分支Switched to branch 'lzx'# git branch* lzx
  master# ls1.txt           
  • 分支之間互相隔離:
# echo "adfwrfrg" > 2.txt# git add 2.txt# git commit -m "add 2.txt"[lzx 9a601f6] add 2.txt
 1 file changed, 1 insertion(+)
 create mode 100644 2.txt# ls1.txt  2.txt				#分支lzx增加了2.txt# git checkout masterSwitched to branch 'master'# ls1.txt				#master分支并沒有2.txt           
  • 分支合并:
如果想把lzx分支合并到master分支,就需要先切換到master分支# git branch
  lzx
* master# git merge lzx				#合并分支Updating 129107f..9a601f6
Fast-forward
 2.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 2.txt# ls      1.txt  2.txt				#此時就可以檢視到lzx分支的内容           
  • 合并沖突:
分支合并很容易産生沖突,如果master分支和lzx分支都對2.txt進行了編輯,
當合并時會提示沖突,需要先解決沖突才能繼續合并# vim 2.txt				#添加下面内容fjfier
frjgire
grjnkjrntg# git add 2.txt# git commit -m "add 2.txt"[master 2852bdc] add 2.txt
 1 file changed, 3 insertions(+)# git checkout lzx				#切換到lzx分支Switched to branch 'lzx'# vim 2.txt				#添加下面内容,和上面不一緻即可fefre
gktmgt
gmlhmyj# git add 2.txt# git commit -m "add 2.txt"[lzx 5fd7ae9] add 2.txt
 1 file changed, 3 insertions(+)# git checkout master				#切換到master分支Switched to branch 'master'# git merge lzx				#合并分支Auto-merging 2.txt
CONFLICT (content): Merge conflict in 2.txt
Automatic merge failed; fix conflicts and then commit the result.				#提示沖突           
  • 解決沖突合并:
産生沖突的原因就是兩邊送出的内容不一緻,那解決沖突就是要讓兩邊送出的内容一緻# vim 2.txt				#修改為lzx分支中2.txt的内容adfwrfrg
fefre
gktmgt
gmlhmyj# git add 2.txt# git commit -m "add 2.txt"[master b23fe49] add 2.txt
 1 file changed, 3 insertions(+), 3 deletions(-)# git merge lzxAlready up-to-date.				#合并成功# git checkout lzxSwitched to branch 'lzx'# cat 2.txt adfwrfrg
fefre
gktmgt
gmlhmyj           

而如果lzx分支修改的内容不是我們想要的怎麼辦?可以在lzx分支下修改為master分支中的内容,送出,然後合并master分支到lzx分支即可(倒着合并)。

分支合并的原則:要把最新的分支合并到舊的分支,即merge後面跟着的分支一定是最新的分支。

  • 删除分支:
# git checkout masterSwitched to branch 'master'# git branch -d lzx				#删除分支Deleted branch lzx (was 5fd7ae9).

如果分支沒有合并,删除之前會提示,那就不合并,強制删除:git branch -D lzx           

遠端分支管理

  • 分支使用原則:
1. master分支十分重要,線上釋出代碼使用這個分支,開發代碼不要使用這個分支;

2. 建立一個dev分支,專門用來開發,隻有當需要釋出到線上時,才會把dev分支合并到master分支;

3. 開發人員應該在dev的基礎上再分支成個人分支,個人分支(在個人PC上)裡面開發代碼,再合并到dev分支。           

本地建立的分支如果不推送到遠端,對其他人就是不可見的。

  • 服務端建立分支:
代碼管理平台GIT

對勾在哪裡就在哪一個分支下。

  • 到用戶端克隆分支:
# git clone [email protected]:Tobewont/mylinux.gitCloning into 'mylinux'...
Enter passphrase for key '/root/.ssh/id_rsa':				#輸入之前配置生成SSH時輸入的密碼remote: Counting objects: 12, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 12 (delta 0), reused 9 (delta 0), pack-reused 0
Receiving objects: 100% (12/12), done.# cd mylinux/# ls2.txt  README.md# git branch* master				#可以看到隻有一個master           

即克隆遠端倉庫預設隻會克隆master分支,即使遠端倉庫有多個分支。

  • 檢視遠端所有分支:
# git ls-remote originEnter passphrase for key '/root/.ssh/id_rsa':				#輸入之前配置生成SSH時輸入的密碼c24d9bbd51579bd6bb0b68484935732f61f7783c	HEAD
c24d9bbd51579bd6bb0b68484935732f61f7783c	refs/heads/dev
c24d9bbd51579bd6bb0b68484935732f61f7783c	refs/heads/master           
  • 克隆指定分支:
# git checkout -b dev origin/dev				#克隆遠端分支并切換到該分支Branch dev set up to track remote branch dev from origin.
Switched to a new branch 'dev'# git branch* dev
  master# ls2.txt  README.md           
  • 修改内容推送到分支:
# vim 2.txt				#添加下面内容fremkg
gtgtr;gmtkrm# git add 2.txt # git commit -m "add 2.txt"[dev 2bcdc0f] add 2.txt
 1 file changed, 3 insertions(+)# git pushEnter passphrase for key '/root/.ssh/id_rsa':				#輸入之前配置生成SSH時輸入的密碼Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 287 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)To [email protected]:Tobewont/mylinux.git
   c24d9bb..2bcdc0f  dev -> dev#		目前在dev分支下,這裡可以看出是本地dev分支推送到遠端dev分支的,因為master分支沒有做任何修改           

對于git push有兩種情況:

1. 當本地分支和遠端分支一緻時:

git push 會把所有分支的變更一同推送到遠端,如果隻想推送一個分支,使用git push origin branch-name

2. 當本地分支比遠端分支多時:

git push 預設隻推送本地與遠端一緻的分支,想要把多出來的分支推送到遠端時,使用git push origin branch-name,
如果推送失敗,先用git pull拉取遠端内容重新送出           

示例:

# git branch dev2# git branch * dev
  dev2
  master# git checkout dev2Switched to branch 'dev2'# ls2.txt  README.md# echo "lzxlzx" > 3.txt# git add 3.txt # git commit -m "add 3.txt"[dev2 c8dd849] add 3.txt
 1 file changed, 1 insertion(+)
 create mode 100644 3.txt# git pushfatal: The current branch dev2 has no upstream branch.
To push the current branch and set the remote as upstream, use    git push --set-upstream origin dev2				#提示你應該這樣git push# git push origin dev2Enter passphrase for key '/root/.ssh/id_rsa':Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 289 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 1 (delta 0)To [email protected]:Tobewont/mylinux.git
 * [new branch]      dev2 -> dev2				#推送成功           

重新整理一下,可以看到服務端已經有dev2分支了。

代碼管理平台GIT

并且dev2分支下有3.txt了。

代碼管理平台GIT

标簽管理

标簽類似于快照功能,可以給版本庫打一個标簽,記錄某個時刻版本庫的狀态,也可以随時恢複到該狀态。相比于分支來說,分支更加實用。

标簽主要是針對master分支進行操作。

  • 打标簽:
# git checkout master				#切換到master分支Switched to branch 'master'# git tag v1.0				#打上标簽v1.0# git tag				#檢視目前分支所有标簽v1.0# git show v1.0				#檢視标簽v1.0内容commit c24d9bbd51579bd6bb0b68484935732f61f7783c				#commit資訊字元串Author: Tobewont <[email protected]>Date:   Thu Sep 6 14:50:01 2018 +0800

    Update README.mddiff --git a/README.md b/README.md
index 6ca591e..5fc27ec 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,8 @@ # mylinux
 aaaaaa
+sn
+ek
+rk
+gt           
  • tag是針對commit來打标簽的,是以可以針對曆史的commit來打标簽:
# git log --pretty=oneline				#檢視曆史commitc24d9bbd51579bd6bb0b68484935732f61f7783c Update README.md
e38ef1e23a4dbf850dbfbfbe0e3253ccc343c740 change readme.md
50590ed936bf9585318a70156a01846fe78f7e74 add 2.txt
ca836f820e54cde73cfba7f768cb36cbce5c0975 first commit# git log --pretty=oneline --abbrev-commit				#檢視曆史commit,資訊字元串簡寫c24d9bb Update README.md
e38ef1e change readme.md
50590ed add 2.txt
ca836f8 first commit# git tag v0.8 e38ef1e23a				#針對commit打标簽,commit資訊字元串可以簡寫# git tagv0.8
v1.0# git show v0.8commit e38ef1e23a4dbf850dbfbfbe0e3253ccc343c740				#可以看到,commit資訊是我們指定的Author: lzx <[email protected]>Date:   Thu Sep 6 02:41:25 2018 -0400

    change readme.mddiff --git a/README.md b/README.md
index cc9aa45..6ca591e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,4 @@ # mylinux+aaaaaa
+bbbbbb
+cccccc           
  • 打标簽時可以對标簽進行描述:
# git tag -a v0.1 -m "lzx tag" ca836f8# git tagv0.1
v0.8
v1.0# git show v0.1tag v0.1
Tagger: lzx <[email protected]>Date:   Thu Sep 6 04:58:56 2018 -0400

lzx tag				#描述資訊commit ca836f820e54cde73cfba7f768cb36cbce5c0975				#指定的commitAuthor: lzx <[email protected]>Date:   Sat Sep 1 08:29:16 2018 -0400

    first commitdiff --git a/README.md b/README.md
new file mode 100644
index 0000000..cc9aa45
--- /dev/null
+++ b/README.md           
  • 删除标簽:
# git tag -d v0.1				#删除标簽v0.1Deleted tag 'v0.1' (was cdb35ab)# git tagv0.8
v1.0           

以上操作都是在用戶端本地進行的,在遠端服務端還沒有任何标簽。

  • 推送指定标簽:
# git push origin v1.0				#推送标簽v1.0Enter passphrase for key '/root/.ssh/id_rsa':Total 0 (delta 0), reused 0 (delta 0)To [email protected]:Tobewont/mylinux.git
 * [new tag]         v1.0 -> v1.0           

服務端重新整理一下,可以看到剛剛推送的标簽v1.0。

代碼管理平台GIT
  • 推送所有标簽:
# git push --tag origin				#推送所有标簽Enter passphrase for key '/root/.ssh/id_rsa':Total 0 (delta 0), reused 0 (delta 0)To [email protected]:Tobewont/mylinux.git
 * [new tag]         v0.8 -> v0.8				#v1.0已經推送,是以隻顯示v0.8為[new tag]           

服務端重新整理一下,可以看到剛剛推送的标簽v0.8。

代碼管理平台GIT
  • 删除遠端标簽:
# git tag -d v0.8				#本地删除v0.8Deleted tag 'v0.8' (was e38ef1e)# git tag v1.0# git push origin :refs/tags/v0.8				#遠端删除v0.8Enter passphrase for key '/root/.ssh/id_rsa':To [email protected]:Tobewont/mylinux.git
 - [deleted]         v0.8				#可以看到v0.8已經删除           

服務端重新整理一下,可以看到剛剛标簽0.8已經被删除。

代碼管理平台GIT

git别名

SVN可以使用别名,GIT也支援别名,指令支援Tab鍵補全。以下别名自定義。

  • 給commit設定别名ci:
# echo "lzxlzx" > 4.txt # git add 4.txt # git config --global alias.ci commit				#給commit設定别名ci# git ci -m "add 4.txt"[master 200f1f5] add 4.txt
 1 file changed, 1 insertion(+)
 create mode 100644 4.txt           
  • 給branch設定别名br:
# git config --global alias.br branch				#給branch設定别名br# git br
  dev
  dev2
* master           
  • 給checkout設定别名ch:
# git config --global alias.ch checkout				#給checkout設定别名ch# git br
  dev
  dev2
* master# git ch devSwitched to branch 'dev'# git br* dev
  dev2
  master           
  • 檢視設定的别名:
# git config --list |grep alias				#檢視設定的别名alias.ci=commit
alias.br=branch
alias.ch=checkout           
  • 檢視所有的配置:
# git config --list				#檢視所有的配置push.default=simple
user.name=lzx
[email protected]
alias.ci=commit
alias.br=branch
alias.ch=checkout
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
[email protected]:Tobewont/mylinux.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.dev.remote=origin
branch.dev.merge=refs/heads/dev# cat ~/.gitconfig				#别名也可以在配置檔案中設定[push]
	default = simple[user]
	name = lzx
	email = [email protected][alias]
	ci = commit
	br = branch
	ch = checkout           
  • 取消别名:
# git config --global --unset alias.br				#取消别名br# git brgit: 'br' is not a git command. See 'git --help'.				#提示br不是一個指令Did you mean one of these?
	branch
	var           

搭建git伺服器

Github畢竟是公開的,而私有倉庫又得花錢買。是以我們可以想辦法搭建一個私有的倉庫,隻有自己公司使用的。Gitlab是一個不錯的選擇,在介紹它之前,先講一下指令行的git伺服器。

  • 換一台機器,安裝git:
# yum install -y git           
  • 添加git使用者,并設定shell為

    /usr/bin/git-shell

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

設定shell為

/usr/bin/git-shell

,目的是為了不讓git使用者遠端登入。

  • 建立authorized_keys檔案,更改屬主屬組和權限:
# cd /home/git/# mkdir .ssh# touch .ssh/authorized_keys				#用來存放用戶端機器的公鑰# chmod 600 !$chmod 600 .ssh/authorized_keys# chown -R git:git .ssh           
  • 在用戶端擷取公鑰:
# cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqWlFPl3JwzR3AiJgolBthMJradp2r1UekJZnnU5hVjDb+pZ72YQUfNdatuUMr96avQYsF+V61sOc/cxa3YPn35n36TW8P+u7FMxZf31eqMatcHG/AWvjW0UsDw+zQrBr5414mj+AIYQgj0GtDIQJbfifGizK7i9UPLy7oW3Ss7+G2+fqhJ2hIo6qTSBHwSdN3rn9ypL0dPIEqJyaaBUpg5a5JKv3KHO5EyJt6Z787SPf3snKddQNpLkgoQ8yPcbZQ3BE5gt6DapMMpLEUUR2adIfe0rWqcDr4Gp9QTW0u+/LgFI6I1UKdTVYvU2UkpUf4WEp+6Q8AROasXxljrNC1 root@lzx           

粘貼到服務端剛剛建立的authorized_keys檔案中

# vim .ssh/authorized_keysssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqWlFPl3JwzR3AiJgolBthMJradp2r1UekJZnnU5hVjDb+pZ72YQUfNdatuUMr96avQYsF+V61sOc/cxa3YPn35n36TW8P+u7FMxZf31eqMatcHG/AWvjW0UsDw+zQrBr5414mj+AIYQgj0GtDIQJbfifGizK7i9UPLy7oW3Ss7+G2+fqhJ2hIo6qTSBHwSdN3rn9ypL0dPIEqJyaaBUpg5a5JKv3KHO5EyJt6Z787SPf3snKddQNpLkgoQ8yPcbZQ3BE5gt6DapMMpLEUUR2adIfe0rWqcDr4Gp9QTW0u+/LgFI6I1UKdTVYvU2UkpUf4WEp+6Q8AROasXxljrNC1 root@lzx           
  • 用戶端連接配接服務端:
# ssh [email protected] authenticity of host '192.168.100.160 (192.168.100.160)' can't be established.
ECDSA key fingerprint is SHA256:teKu3atU+OByPeXXD2xXhyb30vg6nW8ETqqCr785Dbc.
ECDSA key fingerprint is MD5:13:a4:f1:c0:1f:62:65:d4:f4:4e:42:ab:40:f1:36:60.
Are you sure you want to continue connecting (yes/no)? yes       //輸入yes
Warning: Permanently added '192.168.100.160' (ECDSA) to the list of known hosts.
Enter passphrase for key '/root/.ssh/id_rsa':
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.				#提示說明驗證成功Connection to 192.168.100.160 closed.           
  • 服務端建立git倉庫:
# cd /data/# mkdir /data/gitroot/# cd !$cd /data/gitroot/# git init --bare sample.git				#建立sample.git裸倉庫Initialized empty Git repository in /data/gitroot/sample.git/# lssample.git# chown -R git:git sample.git           

裸倉庫沒有工作區,因為伺服器上的git倉庫純粹是為了共享,是以不讓使用者直接登入到伺服器上更改工作區,并且伺服器上的git倉庫通常都是以.git結尾。

對于用戶端來說,git伺服器不需要開發人員直接登入,它僅僅是充當着伺服器的角色,就像github一樣,平時的操作都是在自己的PC上進行操作的。

用戶端怎麼使用git伺服器呢?

1. 首先要把用戶端上的公鑰放到git伺服器的/home/git/.ssh/authorized_keys檔案裡

2. 然後克隆git伺服器的sampl.git倉庫

3. 進入倉庫進行操作,然後push到服務端           
# git clone [email protected]:/data/gitroot/sample.gitCloning into 'sample'...
Enter passphrase for key '/root/.ssh/id_rsa':warning: You appear to have cloned an empty repository.# lsanaconda-ks.cfg  mylinux  sample# cd sample/# ls -latotal 0
drwxr-xr-x  3 root root  18 Sep  6 06:06 .dr-xr-x---. 7 root root 276 Sep  6 06:06 ..drwxr-xr-x  7 root root 119 Sep  6 06:06 .git           
# cp /etc/init.d/README .# git add .# git commit -m "add new file"[master (root-commit) 7ee55ab] add new file
 1 file changed, 27 insertions(+)
 create mode 100644 README# git push origin master				#不指定分支git push會報錯,因為服務端是空倉庫Enter passphrase for key '/root/.ssh/id_rsa':Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 781 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)To [email protected]:/data/gitroot/sample.git
 * [new branch]      master -> master# git push				#再次git push就沒問題了Enter passphrase for key '/root/.ssh/id_rsa':Everything up-to-date# lsREADME           
# cd /tmp/# git clone [email protected]:/data/gitroot/sample.git				#換個目錄克隆倉庫Cloning into 'sample'...
Enter passphrase for key '/root/.ssh/id_rsa':remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)Receiving objects: 100% (3/3), done.# cd sample/# lsREADME				#發現有剛剛git push的檔案           
# echo "ufhueirhfi" > fff.txt # git add fff.txt # git commit -m "add fff.txt"[master bb1f8d4] add fff.txt
 1 file changed, 1 insertion(+)
 create mode 100644 fff.txt# git pushEnter passphrase for key '/root/.ssh/id_rsa':Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)To [email protected]:/data/gitroot/sample.git
   7ee55ab..bb1f8d4  master -> master# cd /root/sample/# git pull				#拉取倉庫内容Enter passphrase for key '/root/.ssh/id_rsa':remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)Unpacking objects: 100% (3/3), done.
From 192.168.100.160:/data/gitroot/sample
   7ee55ab..bb1f8d4  master     -> origin/master
Updating 7ee55ab..bb1f8d4
Fast-forward
 fff.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 fff.txt# lsfff.txt  README# cat fff.txt ufhueirhfi