Git安裝配置使用以及多個遠程庫管理

Git–分佈式版本控制系統
注:只能針對文本內容,不能解析word、視頻、音頻等二進制內容。

一、安裝git

https://git-scm.com/downloads windows 版本,默認選項安裝。
安裝完成後,在git bash關聯賬戶。

$ git config --global user.name "xxxxxx"
$ git config --global user.email "[email protected]"

本機器全局設置用戶名和email。
配置文件在當前系統用戶家目錄下C:\Users\xxxxxx.gitconfig。
特定項目使用其他用戶名和email,去掉–global選項重新配置即可,新的配置保存在該項目的.git/config文件裏。


二、創建版本庫

1. 創建並初始化版本庫

創建版本庫(repository),在這個目錄下的文件可以由Git監管,做版本控制。

$ mkdir git_repository
$ cd git_repository/
$ pwd
/f/git_repository
$ git init
Initialized empty Git repository in F:/git_repository/.git/
/f/git_repository (master)

其中.git目錄用來跟蹤管理版本庫。

2. 添加文件到版本庫

文本文件需要放入到工作區目錄或子目錄下!
1. git add <file>添加到暫存區
2. git commit提交到版本庫【保存快照】

$ git add hellogit.txt
$ git commit -m "hellogit"
-m: 提交說明

三、版本操作

1. 版本庫狀態

查看版本庫狀態

$ git status

查看與之前提交後的改動:git diff <file>

$ git diff hellogit.txt

2. 撤回到上一個版本

查看版本歷史記錄git log,從最近提交到最早提交。

$ git log

僅顯示版本號和描述

$ git log --pretty=oneline
9f4a74f1de984d9e32a2a72b3fd4b42ad1e486bf (HEAD -> master) second
fe100c24747f02f812a5156b60e3d5d36bac0512 hellogit

HEAD -> master中的HEAD表示當前版本指向哪個分支,上一個版本是HEAD^,上上個是HEAD^^,之前第10個版本是HEAD~10

版本退到之前版本

$ git reset --hard HEAD^

版本從之前版本回到之後版本的方法
(1)根據git log查找的版本號。

$ git reset --hard 9f4a74f1de984d9e32a2a72b3fd4b42ad1e486bf

(2)使用git reflog查找出所有的版本歷史軌跡。

$ git reflog
$ git reset --hard 版本號

3. 工作區、暫存區、版本庫

工作區:操作的目錄git_repository。
暫存區.git目錄下的index文件(stage/index)。
版本庫:工作區下的.git目錄。
這裏寫圖片描述
git add <file>操作是將文件修改添加到暫存區index文件;git commit將暫存區所有內容提交到當前分支中。
git init創建Git版本庫時,會自動創建一個master分支,HEAD是指向該分支的指針。


1. git diff:工作區和暫存區的比較;
2. git diff --cached:暫存區和當前分支的比較。
3. 比較版本庫(HEAD指向版本庫當前版本),file即爲當前工作區文件。

$ git diff HEAD -- hellogit.txt

圖引自廖雪峯Git教程https://www.liaoxuefeng.com
Git跟蹤的是文件的修改,已經添加到暫存區的改動,纔會被提交到版本庫。

4. 撤銷修改

文件已經提交,若沒有推送到遠程庫,可以通過版本reset回退。
文件提交之前,通過git checkout -- 文件進行工作區撤銷,使得文件能夠回到最近一次git commit或者git add後的狀態。

$ git checkout -- hellogit.txt
  1. 如果文件修改還未添加到暫存區,執行命令可以清除工作區修改到上一次提交狀態。
  2. 如果文件修改已經添加到暫存區,又進行了修改,執行命令可以清除工作區修改到上一次添加到暫存區狀態。

針對於情況2,撤銷到上一次提交狀態操作。
(1)撤銷已經添加到暫存區的修改【工作區的修改目前處於未add狀態】

$ git reset HEAD hellogit.txt

(2)撤銷修改【情況1】。

5. 文件刪除

情況1. 版本庫正常刪除

$ git rm hellogit.txt
$ git commit -m "remove file"

情況2. 誤刪除,版本庫找回最新提交版本

$ git checkout -- hellogit.txt

四、遠程庫

1. 本地庫連接、推送遠程庫

首先註冊GitHub遠程倉庫;
接着創建SSH Key,連接本地庫和GitHub庫。

$ ssh-keygen.exe -t rsa -C "[email protected]"

在用戶家目錄下生成.ssh目錄,內包含ssh key密鑰對(id_rsaid_rsa.pub)。
在GitHub設置中,添加本機公鑰。
GitHub新建倉庫learngit1(本地庫和遠程庫名稱可以不一致),關聯本地庫和遠程庫(本地庫目錄下操作)。

 /f/git_repository (master)
$ git remote add 
origin git@github.com:xxxxxx/learngit1.git

推送本地庫內容到遠程庫。

第一次推送
$ git push -u origin master
其他修改可以用
$ git push origin master

origin是遠程庫名。將本地的master分支推送到origin庫,同時指定origin爲默認庫,後面就可以不加任何參數使用git push-u用來指定默認庫。
+ 不加任何參數使用git push命令,是推送本地庫當前分支修改。

2. 克隆遠程庫到本地

使用git clone命令克隆遠程庫到本地。

$ git clone git@github.com:xxxxxx/learngit.git

克隆到本地的庫,具備.git版本庫,是新的本地庫。

五、分支

1. 理解分支

Git中,主分支是master分支。
HEAD最終指向當前分支。
如果只有一條分支,即爲主分支master分支。HEAD指向master分支的最新提交。
這裏寫圖片描述

如果創建並切換到分支v1.0,則HEAD指向v1.0分支的最新提交。
這裏寫圖片描述
在分支v1.0上作出修改並提交。
這裏寫圖片描述

2. 分支操作

創建分支v1.0,並切換到分支

$ git checkout -b v1.0
相當於
$ git branch v1.0  創建分支
$ git checkout v1.0   切換分支

查看當前分支

$ git branch

進行v1.0分支操作,切回master分支,併合並v1.0分支內容到主分支

$ git checkout master
$ git merge v1.0  合併指定分支內容到當前分支

此時,可以刪除v1.0分支

$ git branch -d v1.0

:如果分支還未合併過,需要強行刪除分支

$ git branch -D v1.0

3. 分支衝突

衝突的產生
創建分支v1.0,並切換到v1.0,此時master分支和v1.0分支最新提交相同。然後對文件作出修改A,並提交到分支v1.0;切回master分支,作出修改B。此時合併v1.0分支的內容到master分支,就會出現衝突。
衝突的解決
查看文件,手動解決衝突後添加、提交。
Git命令:查看分支合併情況

$ git log --graph --pretty=oneline --abbrev-commit

【有衝突就要解決衝突】

4. 分支合併

Git通常採用的是fast forward策略,直接將master指針指向分支v1.0的最新提交,無合併歷史痕跡。

$ git checkout master
$ git merge v1.0  

這裏寫圖片描述

普通模式合併,禁止該策略,合併後的歷史軌跡上有分支合併。

$ git checkout master
$ git merge --no-ff -m " merge with no-ff" v1.0
$ git log --graph --pretty=oneline --abbrev-commit
*   dc8d4b2 (HEAD -> master) merge
|\
| * 67f5c79 (v1.0) stash1
|/
* c6dbfca (origin/master) 4

這裏寫圖片描述

5. 分支儲藏

git stash用來在不對當前分支進行提交的情況下,暫時存儲當前分支的工作目錄狀態。便於切到其他分支做BUG處理等操作。(注:BUG通常設置BUG分支)

/f/git_repository (v1.0)
$ git stash
Saved working directory and index state WIP on v1.0: 67f5c79 stash1

查看暫存內容(最近的暫存在棧stash@{0}

$ git stash list
stash@{0}: WIP on v1.0: 67f5c79 stash1
stash@{1}: WIP on v1.0: c6dbfca 4

應用暫存內容

方式1$ git stash apply stash@{0}  恢復工作狀態,暫存內容仍在棧中
$ git stash drop   刪除暫存內容
Dropped refs/stash@{0} 
方式2:重新應用儲藏,並將其從堆棧中移走
$ git stash pop

:儲藏也是可以構建分支的(參考資料1:儲藏部分)。

6. 遠程分支

查看遠程庫信息

$ git remote
origin
$ git remote -v
獲取詳細信息

推送本地分支到遠程庫

$ git push origin master 推送master分支
$ git push origin v1.0 推送v1.0分支

是否推送要看是否與其他成員有交互。
:直接git clone的遠程庫,只能看到master分支。要在分支v1.0上設置,需要創建originv1.0分支到本地。

/f/gitworkspace
$ git clone git@github.com:xxxxxx/learngit1.git
$ git branch
* master
$ git checkout -b v1.0 origin/v1.0 切到新分支
$ git branch
  master
* v1.0

:有多個成員同時對v1.0分支相同文件做推送時,會有衝突,推送失敗。
例:
用戶1:/f/gitworkspace/learngit1 (v1.0) 不同的目錄對應不同用戶

對文件作出修改
$ git add hellogit.txt   添加
$ git commit -m "new clone c"  提交
$ git push origin v1.0  推送到遠程庫

用戶2:/f/git_repository (v1.0)

$ git push origin v1.0
error: failed to push some refs to '[email protected]:

【解決方法】
1. 先用git pull抓取遠程origin/v1.0的新提交。
2. 如果git pull失敗,則需要指定本地v1.0分支和遠程origin/v1.0分支的鏈接。

$ git branch --set-upstream-to=origin/v1.0 v1.0
接着,
$ git pull 
Auto-merging hellogit.txt
CONFLICT (content): Merge conflict in hellogit.txt
手動解決衝突,git add, git commit 推送
$ git push origin v1.0 
推送成功

如果此時用戶1再次push依然會報錯,pull會覆蓋文件內容,無衝突。

六、標籤的使用

Git標籤是版本庫的快照,指向提交。標籤對應着commit號。
在當前分支輸入以下指令,便可將標籤打到最新提交的commit上。

$ git tag tag1    
$ git tag   查看所有標籤

給歷史提交打標籤,首先要找到歷史提交的commit id

$ git log --pretty=oneline --abbrev-commit
8e29bdc (HEAD -> v1.0, tag: t1, origin/v1.0) 3
e505539 2
$ git tag t0.9 e505539
也可以給標籤加說明
$ git tag -a v0.9 -m "tag 0.9" e505539

查看標籤信息

$ git show t0.9

注:PGP祕鑰簽名請Google。

$ git tag -s <tagname> -m <description> <branchname> or commit_id

刪除本地標籤

$ git tag -d t0.9

:標籤存儲在本地,不自動推送到遠程庫。
推送標籤到遠程

推送某個標籤
$ git push origin t1
推送所有標籤
$ git push origin --tags

遠程庫刪除標籤

$ git push origin :refs/tags/t1

七、Git遠程庫

1. GitHub和Gitee

注:對於開源項目,可以fork到自己賬戶下,然後克隆到bending修改。否則沒有權限,需要發送給作者pull request
本地庫與碼雲遠程庫設置過程和GitHub類似。
注:本地是根據遠程庫名來識別各個遠程庫的,然而GitHub和碼雲的默認名均爲origin

2. 本地庫同時管理多個遠程庫

(1)刪除已有的GitHub遠程庫

$ git remote rm origin

(2)關聯GitHub遠程庫(庫名github)

$ git remote add github git@github.com:xxxxxx/learngit1.git

(3)關聯碼雲遠程庫(庫名gitee)

$ git remote add gitee git@gitee.com:xxxxxx/learngit1.git

(4)查看遠程庫信息

$ git remote -v
gitee   git@gitee.com:xxxxxx/learngit1.git (fetch)
gitee   git@gitee.com:xxxxxx/learngit1.git (push)
github  git@github.com:xxxxxx/learngit1.git (fetch)
github  git@github.com:xxxxxx/learngit1.git (push)

(5)推送本地庫內容到遠程庫
推送到GitHub

$ git remote add gitee git@gitee.com:xxxxxx/learngit1.git

推送到碼雲

$ git remote add gitee git@gitee.com:xxxxxx/learngit1.git

3. 推送時忽略文件

在Git工作區下創建.gitignore文件。
官網樣例:https://github.com/github/gitignore

八、參考資料

  1. Git官網中文教程https://git-scm.com/book/zh/v1/
  2. 廖雪峯Git教程https://www.liaoxuefeng.com
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章