天天看點

Github_版本控制

Git引言

什麼是Git?

-Git是目前世界上最先進的分布式版本控制系統(沒有之一)(*@ο@*) 哇~。

什麼是GitHub?

-提供Git倉庫托管服務,隻要注冊一個GitHub賬号就可以免費擷取Git遠端倉庫,建立倉庫時屬性若選為public則代碼相當于開源代碼,其他賬号均可fork到自己倉庫檢視代碼,也可選收費private倉庫不開源代碼,看自己的選擇而定。

誰建立的?

-Linux之父Linus Torvalds。

用來幹什麼的?

-簡而言之是一個用來幫助開發人員進行開發工作的工具,可以完成協同開發、代碼備份、沖突解決、權限管理、版本還原等功能。

今天内容是git本地倉庫中常用指令以及遠端倉庫為gitHub托管所的使用,小整理出來一些git常用指令希望可以幫助大家,後期還會為大家推送開發中Eclipse上使用Egit。

一、首先做準備工作:從網上下載下傳git安裝包并安裝及建立一個測試倉庫檔案夾TestGit。

Github_版本控制

安裝完成後在任意的檔案目錄下滑鼠右鍵會出現以下資訊則為安裝成功。

Github_版本控制

顯示上圖後還需要進行最後一步設定即全局配置所有git分支均可用,點選Git Bash Here ,指令行輸入:

$ git config --global user.name "Your Name"

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

Git是分布式版本控制系統,是以需要填寫使用者名和郵箱作為一個辨別。配置資訊在C:\Users\admin路徑下的.gitconfig檔案裡面可以看到。建立一個測試檔案夾TestGit作為Git本地倉庫,在該檔案目錄下右鍵點選Git Bash Here ,指令行輸入 git init,該檔案夾下面會建立一個隐藏檔案.git,則表示建立本地倉庫repository 完成。我們便可以在該檔案夾下面存放各種檔案,git會幫我們将樹形目錄檔案修改或删除曆史版本管理起來。

二、準備工作完成之後開始我們的指令使用

git 基本指令:

初始幾條指令需要借助git版本庫結構了解。

git版本庫的組成結構:

-由.git檔案夾與工作區兩部分組成。.git檔案夾中由git版本可與本地庫兩部分組成,使用add指令将工作區中修改檔案添加到stage暫存區(又叫index索引區),commit指令将暫存區所有檔案送出到本地庫

Github_版本控制

git init : 初始化倉庫

$ git init

Initialized empty Git repository in F:/5.linus/day03 git/TestGit/.git/

git add : 改動檔案由工作區add到暫存區

$ git add filename

git commit : 将檔案由暫存區commit到本地庫

$ git commit -m "message"

[master (root-commit) 053100d] message

1 file changed, 1 insertion(+)

create mode 100644 Git_Commands.txt

git status : 檢視工作區的檔案是否修改、添加、送出狀态

解析:

Changes not staged for commit:該檔案在工作區中被修改,與暫存區版本不同;

Untracked files:在暫存區并沒有找到該檔案的任何蹤迹;

no changes added to commit (use "git add" and/or "git commit -a"):暫存區與本地庫中内容相同

$ git status

On branch master

Changes not staged for commit:

(use "git add <file>..." to update what will be committed)

(use "git checkout -- <file>..." to discard changes in working directory)

modified: Git_Commands.txt

Untracked files:

(use "git add <file>..." to include in what will be committed)

1.txt

no changes added to commit (use "git add" and/or "git commit -a")

git diff : 若檔案修改,檢視修改内容

解析:

-1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2>

\ No newline at end of file

+1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2> 證明兩個檔案均有1,而2 、3第二個檔案有第一個檔案無。

$ git diff Git_Commands.txt

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

index c98ff22..5d88cb5 100644

--- a/Git_Commands.txt

+++ b/Git_Commands.txt

@@ -1 +1,3 @@

-1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2>

\ No newline at end of file

+1<A1><A2>git init - <B3><F5>ʼ<BB><AF><B2>ֿ<E2>

+2<A1><A2>git add filename

+3<A1><A2>git commit -m "message"

\ No newline at end of file

git log : 檢視曆史記錄

$ git log

$ git log --pretty=oneline

版本穿梭時光功能即git的主要功能指令。

git reset : 回退功能(可了解穿梭到古代)

由上面的git版本庫的組成結構圖可知:HEAD作為一個指針指向本地庫的檔案最新版本,HEAD^表示回退到目前版本的上一個版本,兩個^^表示上上一個版本,但是我們想回退到上50個版本呢?是以當回退版本較多時推薦直接回退到相應版本号指令。版本号的選取為前6~7位,避免出現選位少時,當多個版本号前幾位相同git不知道回退到哪個版本号。

$ git reset --hard HEAD^

$ git reset --hard 053100

當出現回退行為的時候,git log 将隻能顯示目前版本之前的曆史記錄,那麼怎麼才能重返現代呢?使用git reflog指令檢視所有的版本号再使用$ git reset --hard 版本号 即可實作。

git reflog指令檢視所有的版本号,從古至今,版本号變化記錄

git reset HEAD filename : 将暫存區修改還原即用于當不小心将檔案add并未commit時可使用此指令将暫存區新add檔案删除。

$ git reset HEAD 1.txt

當工作區檔案修改混亂想要找回上一個完整版本的時候使用git checkout --filename指令,則暫存區版本将工作區版本覆寫。

git checkout -- filename : 放棄工作區版本修改将工作區檔案回退到暫存區最新版本

此指令也可用于誤删了工作區的檔案,恰好這個檔案又曾經add到暫存區,運作指令令即可将暫存區版本恢複到工作區,但是會丢失檔案最新一次修改的内容。

git rm : 删除工作區檔案

$ git rm 1.txt

$ git checkout -- 1.txt

注意:

git checkout feature :為切換到另一個分支指令

git 分支指令:

多人協作開發項目,每開發一個新功能均要建立一個新分支進行開發後合并到主分支上,主分支并不進行開發僅用來tag标記釋出版本号和合并分支。類似圖下:

Github_版本控制

git branch : 檢視目前分支

git branch name : 建立一個新分支

git branch -d name:删除分支

git branch -D name : 強制删除一個未合并過的分支

git checkout feature :為切換到另一個分支指令

git checkout -b name:建立加直接切換

xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (master)

$ git checkout -b feature01

Switched to a new branch 'feature01'

xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (feature01)

$

git log --graph : 檢視分支合并圖

git merge feature01: 該分支合并feature01分支内容,若無法合并則需要手動解決沖突。

在主分支中将Git_Commands.txt檔案修改,切換到feature01分支上将Git_Commands.txt檔案修改後切到主分支上合并feature01分支,必然發生沖突,如下所示,且沖突檔案上會有黃色警示号。

xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (feature01)

$ git checkout master

Switched to branch 'master'

xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (master)

$ git merge feature01

Auto-merging Git_Commands.txt

CONFLICT (content): Merge conflict in Git_Commands.txt

Automatic merge failed; fix conflicts and then commit the result.

xiaohui@▒▒▒▒▒▒ MINGW32 /f/linus/git/TestGit (master|MERGING)

$

解決方法:

使用git diff 檢視兩個檔案的不同,并手動解決後再合并。

<<<<<<< HEAD

=======

>>>>>>> feature01 表示中間的為沖突内容。

$ git diff

diff --cc Git_Commands.txt

index e73c914,dc48471..0000000

--- a/Git_Commands.txt

+++ b/Git_Commands.txt

@@@ -3,5 -3,5 +3,10 @@@

3<A1><A2>git commit

4<A1><A2>git log

5<A1><A2>git reflog

++<<<<<<< HEAD

+6<A1><A2>git diff

- 7<A1><A2>git merge

++7<A1><A2>git merge

++=======

+ 6<A1><A2>git branch

-7<A1><A2>git branch name

++7<A1><A2>git branch name

++>>>>>>> feature01

$ git merge feature01

Already up-to-date.

當我們手頭正在feature01分支上做着工作,又臨時要修複一個bug。當然每個bug都可以通過一個新的臨時分支來修複,修複後合并分支,然後将分支删除。

但是若目前工作還達不到送出的狀态,轉換分支的時候是不可以的。

$ git checkout feature01

error: Your local changes to the following files would be overwritten by checkout:

Git_Commands.txt

Please commit your changes or stash them before you can switch branches.

Aborting

那麼我們就可以使用以下指令解決這個問題:

git stash :将目前工作現場封鎖起來

然後建立新的bug分支,修改bug,修改完後回到我們工作的分支。工作區是并沒有任何修改的迹象的,那我們的工作現場到哪裡去了呢?使用git stash list 檢視我們的工作現場。

$ git stash list

stash@{0}: WIP on feature01: 6dd29b4 添加分支指令到分支feature01上

git stash apply :恢複封鎖工作現場

git stash drop:删除封鎖現場痕迹

git stash pop: 快速那麼一點點回複現場(= git stash apply + git stash drop)

以下為遠端倉庫與本地倉庫互動的操作指令:

git remote add origin git@server-name:path/repo-name.git : 關聯遠端庫指令

$ git remote add origin [email protected]:yourselfgit/TestGit.git

git push -u : 第一次将本地庫内容push推送到遠端倉庫,origin為git遠端庫的預設叫法

git push : 以後當commit之後就将本地庫内容push推送到遠端倉庫,origin為git遠端庫的預設叫法

$ git push -u origin master

$ git push origin master

由于我們的本地倉庫與GitHub倉庫之間是進項SSH加密的所有需要設定兩點:

1、建立SSHkey:一路回車使用預設值即可,之後可以在根據指令行提示在使用者主目錄中找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,是SSH key的秘鑰對,id_rsa是私鑰一定不要告訴别人,id_rsa.pub是公鑰,就是要告訴别人的。

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

2、登入GitHub,登入自己賬戶->"settings"->"SSH and GPG keys”頁面 ,“add SSH key ”->" New SSH key "将id_rsa.pub 粘貼到上面 "Add SSH key ",添加完成後将出現SSH key界面。但是為什麼我們需要SSH key呢?是因為GitHub需要通過SSH key 來确定被推送的檔案是否為SSH key對應的倉庫所推送,而且還可以添加多個SSH key,即可以接收多個倉庫進行推送。若為public 倉庫則裡面的檔案被全網共享,但是僅僅可以接收SSH key對應的倉庫的推送,這個要搞清楚。

建立倉庫,預設選擇即可,可以看到下圖,Git支援兩種協定:(1)http (2)SSH來實作本地倉庫到遠端倉庫的push,但是通過SSH支援的原生Git協定速度快,現在我們來實作本地倉庫與遠端倉庫的檔案同步工作吧。

Github_版本控制

根據倉庫提示給本地倉庫添加遠端倉庫并将檔案同步:

在本地倉庫中右鍵bash 出指令行

git remote add origin " input SSH key or Http in here " : 添加遠端倉庫起别名為origin ""中輸入從遠端倉庫複制來的SSH key 或 http網址。

Github_版本控制

當第一次使用push或clone指令時将會出現警告資訊:

$ git push -u origin master

The authenticity of host 'github.com (192.30.253.112)' can't be established.

RSA key fingerprint is SHA256:XXXXX.

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

這是因為Git使用SSH連接配接時會讓我們确認下GitHub的Key資訊是否來自GitHub伺服器,輸入yes後回車即可。

而後Git會輸出警告告知我們已經将該GitHub的相關資訊添加到信任清單,之後再進行推送就不會再出現了。

克隆:

從遠端庫克隆檔案到我們GitHub倉庫,在GitHub賬戶中建立一個新的倉庫TestClone,複制其SSH key 或https ,我們在本地庫使用指令

進行遠端倉庫到本地倉庫的clone,這樣的話遠端倉庫裡面的檔案就下載下傳到本地啦。

$ git clone [email protected]:zhangzh121/TestClone.git

Github_版本控制

抓取分支:

當多人協作時,大家會在各個分支上推送各自的修改,當遠端倉庫同一個檔案被不同的人修改并前後推送時,第二個小夥伴必然會推送失敗,那麼怎麼解決沖突呢?

$ git push origin master

To [email protected]:zhangzh121/MyFirstRepo.git

! [rejected] master -> master (fetch first)

error: failed to push some refs to '[email protected]:zhangzh121/MyFirstRepo.git'

hint: Updates were rejected because the remote contains work that you do

hint: not have locally. This is usually caused by another repository pushing

hint: to the same ref. You may want to first integrate the remote changes

hint: (e.g., 'git pull ...') before pushing again.

首先,使用git pull 指令将檔案拉到本地,手動解決沖突代碼,後add->commit->push後就能成功了,若pull時顯示“no tracking information”,則是因為沒此分支問題則使用分支指令git branch --set-upstream breach-name origin/branch-name。

tag标簽:

git tag name : 為主分支版本打上新标簽即版本号

git tag : 檢視所有的标簽

$ git tag v1.0 //為目前版本打上v1.0标簽

$ git tag v1.0 053100 //為指定版本打上v1.0标簽

$ git push origin v1.0 //遠端推送特定版本

$ git push origin --tags //将全部未推送遠端倉庫的本地标簽推送

$ git tag -d v1.0 //删除标簽

$ git push origin :refs/tags/v1.0 //将遠端倉庫推送标簽删除

$ git show v1.0 //檢視标簽資訊

ignore檔案:

GitHub 已經為我們準備了各種配置檔案,可參考線上浏覽配置檔案:https://github.com/github/gitignore,

此檔案的設定主要為:

1、忽略系統自動生成的檔案,如縮略圖等;

2、忽略編譯生成的中間檔案、可執行檔案等;

3、忽略自己的帶有敏感資訊的配置檔案,如存放密碼的配置檔案等。

配置别名:

目的簡化指令,如下例:

$ git config --global alias.st status

$ git config --global alias.ci commit

$ git config --global alias.st st //則之後使用git st 顯示工作區檔案修改狀态

小整理結束啦!