用git管理你的專案吧(最全的乾貨)

Stefan的程式碼小屋發表於2018-04-23

git是什麼?

Git是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。

git的用途

個人理解:

  • git是一個非常好的多人協作的工具,而且功能也十分強大。
  • 對於個人來說,git是管理你寫的大大小小專案的一個工具,你可以把你寫的筆記、程式碼上傳到遠端倉庫,也可以在遠端倉庫clone別人寫的專案檢視別人寫的筆記。官方遠端倉庫github,也有國內倉庫碼雲。

git的安裝

在windows上安裝git

在linux上安裝git

github的註冊和使用

github適合個人使用,這裡我只講述連線遠端倉庫的兩種方式。

  • 第一種:HTTPS方式

  • 第二種:SSH方式,對於初學者,不知道ssh在哪裡,我的在C:\Users\asus.ssh,找到id_rsa.pub,以記事本的方式開啟復制,登入到自己的github,點選右上角的頭像,再點選Settings,找到SSH and GPK keys 點選 ,右上角有個New SSH key 的按鈕點選,隨便填一個Title,再把你剛才複製的東西貼上到Key框裡,然後點選Add SSH key,就可以用SSH克隆專案了。 (如果找不到.ssh,在計算機裡搜尋)

git配置全域性變數

配置使用者名稱郵箱:

git config --global user.name stefan
git config --global user.email 502681863@qq.com
複製程式碼

這樣你提交的遠端分支就顯示你的資訊了。

當然你也可以找到git的配置檔案.gitconfig,進行修改。我的在C:\Users\asus下面,如果找不到可以搜尋檔名.gitconfig。

我的以記事本開啟是這樣的:

[user]
	name = Stefan
	email = 502681863@qq.com
	signingkey = stefan0712
[credential]
	helper = manager
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[color]
	ui = true
[alias]
	st = status
	cm = commit -m
	ck = checkout
	plo = pull origin
	ps = push
	a =add .
複製程式碼

剛才以命令設定的name和email都在這個檔案裡。

git使用邏輯

個人使用:

想把本地的一個專案上傳到github,並且之前也沒有與遠端有管理。

步驟:

  1. 開啟專案資料夾,右擊選中Git Bush Here,開啟git命令框,輸入git init 即把當前的目錄變成可以管理的git倉庫,生成隱藏.git檔案。
  2. 在github裡新建一個專案,複製HTTPS地址或者SSH地址
  3. 在git命令裡輸入git remote add origin https://github.com/StefanPython/demo.git與遠端新建的專案建立連線。
  4. 檢視遠端庫的資訊,輸入命令git remote,顯示origin就證明建立連線成功。
  5. 現在就可以上傳專案到遠端倉庫了,git status 檢視檔案在git倉庫中的狀態,顯示紅色說明檔案還在本地工作區
  6. 命令列輸入git add . 將所有的檔案新增到暫存區,現在git status 檔案顯示綠色。
  7. 命令列輸入git commit -m "新建什麼,修改什麼",這樣就是把檔案提交到版本庫
  8. git push -u origin master 將專案推送到遠端倉庫(同時也將本地分支master推送到遠端),登上github開啟剛新建的專案,重新整理就會出現你推送的東西。(第一次推送要加-u,這樣以後就可以直接git push,不用再加 origin master)
  9. 實際工作中對本地專案的修改再推送到遠端就是重複5-8的步驟

在遠端先建立一個專案,把空專案clone到本地

步驟:

  1. 在github上新建一個空專案,複製HTTPS或者SSH
  2. 在本地盤中隨便找一個地方右鍵開啟git命令窗,輸入git clone git@github.com:StefanPython/demo.git 本地就會出現一個和遠端一樣的專案,並且已經和遠端建立了來接。
  3. 如此就可以使用命令
git status
git add .
git commit -m "修改"
git push(這裡是直接可以push的,因為把遠端master也克隆下來了)
複製程式碼

多人協作

多人協作和個人協作的最大區別是,多個人在一個分支下提交,這就避免不了有衝突。個人使用的時候應該是幾乎不會出現衝突。

多人協作步驟:

  1. 新建專案,預設有一個主分支master,還要新建一個develop分支,簡稱dev,一般都是在dev分支下工作的,到最後專案測試基本完成,要釋出了,就把dev分支下的專案合併到master分支上。master分支基本不做改動,只做專案版本的更新。
  2. 讓每一個協作者克隆遠端專案到本地,自然也就克隆了master分支和dev分支,切換到dev分支下進行工作。
  3. 有時候別人修改了一個地方已經提交到遠端了,自己也修改了同樣的地方,自己也要push時卻失敗了,這是因為遠端專案的版本是最新的,可能和你修改的有衝突,所以每次push前先git pull ,把遠端下拉後解決衝突再push就可以成功了。
  4. 當然你也可以在本地建立一個自己的分支dev_name,平時工作在自己分支下工作,等要push到遠端的時候就切換到dev分支下git merge dev_name 把dev_name 下的程式碼合併到dev下就可以了。
git checkout dev(切換到dev分支)
git status
git add .
git commit -m "修改"
git pull origin dev
git push

git checkout –b dev_xfy(建立並切換到dev_xfy分支下)
git checkout dev
git merge dev_xfy(合併dev_xfy到dev)
git pull origin dev
git push
複製程式碼

解決衝突:

當兩個分支在同一個檔案的同一個位置做了修改時,二者合併時會出現衝突,檢視衝突,留下正確的修改,重新 git add b.txt git commit -m'衝突已解決'。

其實解決衝突也很簡單,當衝突出現時,git status 會告訴你哪些檔案有衝突(顯示紅色的檔案),在專案中找到相應的檔案 看到類似的

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev_xfy
複製程式碼

Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,我們把這些標記刪掉,留下正確的程式碼就可以了。

碼雲的使用

為什麼要使用碼雲呢,因為碼雲是中文的,並且它更適合多人協作,一個組織的管理。

同樣的使用方法和github很類似,首先得註冊一個碼雲賬號。接下來就是配置SSH,和github過程基本一樣。

git常用命令總結:

    mkdir:         XX (建立一個空目錄 XX指目錄名)
&emsp;&emsp;pwd:          顯示當前目錄的路徑。
&emsp;&emsp;git init          把當前的目錄變成可以管理的git倉庫,生成隱藏.git檔案。
&emsp;&emsp;git add XX       把xx檔案新增到暫存區去。
&emsp;&emsp;git commit –m “XX”  提交檔案 –m 後面的是註釋。
&emsp;&emsp;git status        檢視倉庫狀態
&emsp;&emsp;git diff  XX      檢視XX檔案修改了那些內容
&emsp;&emsp;git log          檢視歷史記錄
&emsp;&emsp;git reset  --hard HEAD^ 或者 git reset  --hard HEAD~ 回退到上一個版本
&emsp;&emsp;(如果想回退到100個版本,使用git reset –hard HEAD~100 )
&emsp;&emsp;cat XX         檢視XX檔案內容
&emsp;&emsp;git reflog       檢視歷史記錄的版本號id
&emsp;&emsp;git checkout -- XX  把XX檔案在工作區的修改全部撤銷。
&emsp;&emsp;git rm XX          刪除XX檔案
&emsp;&emsp;git remote add origin https://github.com/StefanPython/demo.git 關聯一個遠端庫
&emsp;&emsp;git push –u(第一次要用-u 以後不需要) origin master 把當前master分支推送到遠端庫
&emsp;&emsp;git clone https://github.com/tugenhua0707/testgit  從遠端庫中克隆
&emsp;&emsp;git checkout –b dev  建立dev分支 並切換到dev分支上
&emsp;&emsp;git branch  檢視當前所有的分支
&emsp;&emsp;git checkout master 切換回master分支
    git branch -m newname 修改當在分支
    git branch -m oldname newname 修改其他分支名字
&emsp;&emsp;git merge dev    在當前的分支上合併dev分支
&emsp;&emsp;git branch –d dev 刪除dev分支
&emsp;&emsp;git branch name  建立分支
&emsp;&emsp;git stash 把當前的工作隱藏起來 等以後恢復現場後繼續工作
&emsp;&emsp;git stash list 檢視所有被隱藏的檔案列表
&emsp;&emsp;git stash apply 恢復被隱藏的檔案,但是內容不刪除
&emsp;&emsp;git stash drop 刪除檔案
&emsp;&emsp;git stash pop 恢復檔案的同時 也刪除檔案
&emsp;&emsp;git remote 檢視遠端庫的資訊
&emsp;&emsp;git remote –v 檢視遠端庫的詳細資訊
&emsp;&emsp;git push origin master  Git會把master分支推送到遠端庫對應的遠端分支上
    git branch --merged顯示已經全部合併到當前分支的分支
    git branch --no-merged顯示沒有合併到當前分支的分支
      如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。

複製程式碼
檢視日誌:
                git log
                有更好的格式 git log --pretty=oneline
                檢視所有操作日誌git reflog
版本回退:
                git reset --hard head^ 回到上一個版本
                git reset --hard 版本號 想回到的版本號
                獲得版本號的命令 git reflog
撤銷上一次的修改(未提交的並且是在快取區的):
                git checkout  -- 檔名  在暫存區修改檔案未提交,可用此命令撤銷當前未提交的修改,如果有多個檔案修改需要撤銷  git checkout -- .
                git reset --hard head 定位到當前提交狀態指標,當一個暫存區檔案修改後未提交時等同於git checkout -- 檔名
     注意:命令git checkout -- readme.txt 中的 -- 很重要,如果沒有 -- 的話,那麼命令變成建立分支了。
               只要沒有commit都可以還原
連線遠端倉庫:
                  git remote add origin1 https://github.com/xfy007/gitsecond.git  新增測試用的遠端倉庫
                  git push -u origin1 master  每次我們要提交程式碼到伺服器上時,都會使用到git push。git push命令會有兩個引數,遠端倉庫的名字,以及分支的名字
                 由於遠端庫是空的,我們第一次推送master分支時,加上了 –u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。經後可直接git push
從遠端倉庫克隆:
               git clone https://github.com/xfy007/gitsecond.git

總結建立與合併分支命令如下:
&emsp;&emsp;          檢視分支:git branch
&emsp;&emsp;          建立分支:git branch name
&emsp;&emsp;          切換分支:git checkout name
&emsp;&emsp;          建立+切換分支:git checkout –b name
&emsp;&emsp;          合併某分支到當前分支:git merge name
&emsp;&emsp;          刪除分支:git branch –d name

儲存工作現場:
        當一個分支上的工作還沒完成,不能提交時,但是有一個bug需要我再主分支上新建一個分支去解決,所以用到
        git  stash 來儲存工作現場
        git status 檢視沒有未提交的工作
        要恢復工作現場 方法一:git stash pop (恢復並刪除stash內容)法二:git stash apply(恢復)   , git stash drop(一個個刪除)
檢視SSH公鑰的相關命令:
ssh-keygen  重新生成SSH公鑰
cd ~/.ssh 切換到.ssh目錄下
ll -a 檢視.ssh下有哪些檔案
cat ~/.ssh/id_rsa.pub  檢視ssh  key
複製程式碼

注:命令無須強記,多使用,就會熟練。

為git命令設定別名:

每次輸那麼長的命令,感覺效率很低,也很麻煩。可以把這些長命令設定別名。

如: git status 設定成 git st

git add . 設定成git a

git commit -m 設定成 git cm

有命令修改別名但是一個一個修改好麻煩,你可以再次找到.gitconfig檔案,開啟,找到[alias]標籤,如下

[alias]
	st = status
	cm = commit -m
	ck = checkout
	plo = pull origin
	ps = push
	a =add .
複製程式碼

照這個樣子修改就行了。

可以從git裡開啟.gitconfig檔案 命令如下

cd
cat .gitconfig
vim .gitconfig  (進入vim編輯器)
在英文輸入法下按i,進入輸入模式,修改完成後,在英文輸入法下點ESC,在點shift+:底部就會出現一個:,輸入wq,就儲存退出了
再通過cat .gitconfig檢視是否修改

複製程式碼

git 相關概念的理解:

工作區:

將一個資料夾通過git init 設定成一個git可以管理的資料夾時,這個資料夾裡的內容就是工作區。

暫存區:

暫存區,叫stage 或者 index ,是用來暫時存放工作區中修改的內容; 可以理解為一箇中轉站

版本庫:

通過git init 會生成一個隱藏的檔案.git,這個,git裡的東西就是版本庫

master:

master是主分支,當我們git init後,並不會立刻產生master, 而是我們新增了一個檔案,並git add .,git commit後, 這時我們檢視分支情況, 便可以看到master分支了。(分支都存放在.git/head/refs目錄下)

HEAD:

HEAD是一個引用,引用的是當前的分支, 如果當前處於master分支,那麼HEAD就會指向master。

注:對三個區(工作區,暫存區、版本庫)有影響的幾個命令

git add   當我們使用git add 指令時,就是將對應修改的檔案新增到暫存區中
這時,暫存區中的目錄樹被更新。

git commit 我們使用git commit指令,便會將暫存區中做出的修改提交到版本庫中
這時master指向的分支被更新。

git reset HEAD  當使用git reset HEAD 指令時,版本庫的內容會回退到暫存區。

git checkout --file 使用git checkout --file時,是將工作區指定修改的檔案被暫存區的內容覆蓋(消除所有工作區進行的改動),這個動作很危險。
git checkout . 也是如此,該指令是將所有修改的檔案被暫存區的內容覆蓋。

git rm --cached 使用git rm --cached file時,直接從暫存區進行檔案的刪除,不會影響工作區的內容。

git checkout HEAD --file git checkout  HEAD --flie 時,會將版本庫中的對應的檔案內容直接替換工作區和暫存區中的該檔案。
這個動作也是危險的,同樣git checkout HEAD . 是將所有的內容替換工作區和暫存區的檔案。
複製程式碼

檢視三個分割槽的區別:

git diff 檢視工作區和暫存區的區別
git diff --cached 檢視暫存區和版本庫之間的區別
git diff HEAD 檢視工作區和版本庫之間的區別
git status 檢視當前的工作狀態
複製程式碼

學到最後,其實還是雲裡霧裡的,先不急,一個git也就這麼多,沒必要去深究,會用就行。只要用起來,在實踐中學習,會理解更深刻。時間會慢慢解開你的疑惑。

有任何疑問請留言評論。

相關文章