Git新手入門總結(含目錄)

一、創建版本庫(git init)

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

第一步,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

第二步,通過git init命令把這個目錄變成Git可以管理的倉庫:

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
不一定必須在空目錄下創建Git倉庫,選擇一個已經有東西的目錄也是可以的。

第三步,現在我們編寫一個readme.txt文件,內容如下:

Git is a version control system.
Git is free software.
一定要放到learngit目錄下(子目錄也行)

用命令git add告訴Git,把文件添加到倉庫:

$ git add readme.txt
命令git commit告訴Git,把文件提交到倉庫:

$ git commit -m “wrote a readme file”
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的

二、版本回退(git reset --hard **)

在實際工作中,我們腦子裏怎麼可能記得一個幾千行的文件每次都改了什麼內容,不然要版本控制系統幹什麼。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看:

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao [email protected]
Date: Fri May 18 21:06:15 2018 +0800

append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao [email protected]
Date: Fri May 18 21:03:36 2018 +0800

add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao [email protected]
Date: Fri May 18 20:59:18 2018 +0800

wrote a readme file

git log命令顯示從最近到最遠的提交日誌,我們可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。

如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上–pretty=oneline參數:

$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
需要友情提示的是,你看到的一大串類似1094adb…的是commit id(版本號)

1、回退到上個版本

在Git中,用HEAD表示當前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD,上上一個版本就是HEAD,當然往上100個版本寫100個比較容易數不過來,所以寫成HEAD~100。

現在,我們要把當前版本append GPL回退到上一個版本add distributed,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
–hard參數有啥意義?這個後面再講,現在你先放心使用。

2、取消回退

commit id是1094adb…,我們就可以指定回到未來的某個版本:

$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
版本號沒必要寫全,前幾位就可以了,Git會自動去找。

三、撤銷修改(git checkout – fileName)

it會告訴你,git checkout – file可以丟棄工作區的修改:

$ git checkout – readme.txt

命令git checkout – readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷,這裏有兩種情況:

一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;

一種是readme.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。

總之,就是讓這個文件回到最近一次git commit或git add時的狀態。

四、刪除文件(git rm fileName)

$ git rm readme.txt

刪除readme.txt文件,包括工作區間和版本庫中的文件一併刪除

五、工作區與版本庫(add–>stage,commit–>master)

工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。

分支和HEAD的概念我們以後再講。

前面講了我們把文件往Git版本庫裏添加的時候,是分兩步執行的:

第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;

第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

1、在工作區新增一個LICENSE文本文件(內容隨便寫)。

先用git status查看一下狀態:

$ git status
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:   readme.txt

Untracked files:
(use “git add …” to include in what will be committed)

LICENSE

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

Git非常清楚地告訴我們,readme.txt被修改了,而LICENSE還從來沒有被添加過,所以它的狀態是Untracked。

2、使用兩次命令git add,把readme.txt和LICENSE都添加後,用git status再查看一下:

$ git status
On branch master
Changes to be committed:
(use “git reset HEAD …” to unstage)

new file:   LICENSE
modified:   readme.txt

現在,暫存區的狀態就變成這樣了:

所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage)

3、執行git commit就可以一次性把暫存區的所有修改提交到分支。

$ git commit -m “understand how stage works”
[master e43a48b] understand how stage works
2 files changed, 2 insertions(+)
create mode 100644 LICENSE

一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾淨”的:

$ git status
On branch master
nothing to commit, working tree clean

現在版本庫變成了這樣,暫存區就沒有任何內容了:

六、分支管理(branch)

查看分支:git branch

創建分支:git branch

切換分支:git checkout 或者git switch

創建+切換分支:git checkout -b 或者git switch -c

合併某分支到當前分支:git merge

如果用--no-ff ,則合併後的歷史有分支,能看出曾經做過合併

$ git merge --no-ff -m “merge with no-ff” dev
刪除分支:git branch -d

如果要丟棄一個沒有被合併過的分支,可以通過git branch -D 強行刪除

保存現場:git stash

1.git stash 是保存現場的命令

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

現在,用git status查看工作區,就是乾淨的(除非有沒有被Git管理的文件)。可以離開當前分支去其他分支工作,比如其他分支處理bug。

2.工作區是乾淨的,剛纔的工作現場存到哪去了?用git stash list命令看看:

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:

一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;

另一種方式是用git stash pop,恢復的同時把stash內容也刪了;

3.在master分支上修復的bug,想要合併到當前dev分支,可以用git cherry-pick <commit編號>命令,把bug提交的修改“複製”到當前分支,避免重複勞動。

$ git cherry-pick 4c805e2

七、關聯github/gitee

第一步,在github/gitee上面建立一個庫,以便與本地庫關聯

第二步,本地操作

使用命令git remote add origin https://github.com/weaponLiu/res01.git 關聯遠程庫

關聯後,使用命令git push -u origin master第一次推送master分支的所有內容;

此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改;

補充:從遠程庫克隆

git clone https://github.com/weaponLiu/gitskills.git
https://github.com/weaponLiu/gitskills.git是遠程數據庫的地址

八、多人協作(pull)

查看遠程庫信息,使用git remote -v;

本地新建的分支如果不推送到遠程,對其他人就是不可見的;

從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;

在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;

建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;

從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。

多人協作的工作模式通常是這樣:

1.首先,可以試圖用git push origin 推送自己的修改;

2.如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖 合併;

3.如果合併有衝突,則解決衝突,並在本地提交;

4.沒有衝突或者解決掉衝突後,再用git push origin 推送就能成功!

5.如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream-to origin/。

九、標籤管理(tag)

命令git tag 用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;

命令git tag -a -m "blablabla…"可以指定標籤信息;

命令git tag可以查看所有標籤;

命令git push origin 可以推送一個本地標籤;

命令git push origin --tags可以推送全部未推送過的本地標籤;

命令git tag -d 可以刪除一個本地標籤;

命令git push origin :refs/tags/可以刪除一個遠程標籤;

十、忽略特殊文件(.gitignore)

在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件。

不需要從頭寫.gitignore文件,GitHub已經爲我們準備了各種配置文件,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore

忽略文件的原則是:

忽略操作系統自動生成的文件,比如縮略圖等;
忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;
忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
舉個例子:

假設你在Windows下進行Python開發,Windows會自動在有圖片的目錄下生成隱藏的縮略圖文件,如果有自定義目錄,目錄下就會有Desktop.ini文件,因此你需要忽略Windows自動生成的垃圾文件:

#Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

然後,繼續忽略Python編譯產生的.pyc、.pyo、dist等文件或目錄:

#Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
加上你自己定義的文件,最終得到一個完整的.gitignore文件,內容如下:

#Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

#Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

#My configurations:
db.ini
deploy_key_rsa
最後一步就是把.gitignore也提交到Git,就完成了!當然檢驗.gitignore的標準是git status命令是不是說working directory clean。

使用Windows的童鞋注意了,如果你在資源管理器裏新建一個.gitignore文件,它會非常弱智地提示你必須輸入文件名,但是在文本編輯器裏“保存”或者“另存爲”就可以把文件保存爲.gitignore了。

有些時候,你想添加一個文件到Git,但發現添加不了,原因是這個文件被.gitignore忽略了:

$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.

如果你確實想添加該文件,可以用-f強制添加到Git:

$ git add -f App.class
或者你發現,可能是.gitignore寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore命令檢查:

$ git check-ignore -v App.class
.gitignore:3:*.class App.class

Git會告訴我們,.gitignore的第3行規則忽略了該文件,於是我們就可以知道應該修訂哪個規則。

十一、配置別名(config)

1、如果敲git st就表示git status那就簡單多了,當然這種偷懶的辦法我們是極力贊成的。

我們只需要敲一行命令,告訴Git,以後st就表示status:

$ git config --global alias.st status

好了,現在敲git st看看效果。

2、配置文件放哪了?每個倉庫的Git配置文件都放在.git/config文件中:

$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote “origin”]
url = [email protected]:michaelliao/learngit.git
fetch = +refs/heads/:refs/remotes/origin/
[branch “master”]
remote = origin
merge = refs/heads/master
[alias]
last = log -1

別名就在[alias]後面,要刪除別名,直接把對應的行刪掉即可。

而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中:

$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = [email protected]

配置別名也可以直接修改這個文件,如果改錯了,可以刪掉文件重新通過命令配置。

十二、搭建Git服務器

GitHub就是一個免費託管開源代碼的遠程倉庫。但是對於某些視源代碼如生命的商業公司來說,既不想公開源代碼,又捨不得給GitHub交保護費,那就只能自己搭建一臺Git服務器作爲私有倉庫使用。

搭建Git服務器需要準備一臺運行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,通過幾條簡單的apt命令就可以完成安裝。

假設你已經有sudo權限的用戶賬號,下面,正式開始安裝。

第一步,安裝git:

$ sudo apt-get install git
第二步,創建一個git用戶,用來運行git服務:

$ sudo adduser git
第三步,創建證書登錄:

收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。

第四步,初始化Git倉庫:

先選定一個目錄作爲Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:

$ sudo git init --bare sample.git
Git就會創建一個裸倉庫,裸倉庫沒有工作區,因爲服務器上的Git倉庫純粹是爲了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾。然後,把owner改爲git:

$ sudo chown -R git:git sample.git

第五步,禁用shell登錄:

出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下面的一行:

git❌1001:1001:,:/home/git:/bin/bash
改爲:

git❌1001:1001:,:/home/git:/usr/bin/git-shell
這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因爲我們爲git用戶指定的git-shell每次一登錄就自動退出。

第六步,克隆遠程倉庫:

現在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:

$ git clone git@server:/srv/sample.git
Cloning into ‘sample’…
warning: You appear to have cloned an empty repository.
剩下的推送就簡單了。

管理公鑰
如果團隊很小,把每個人的公鑰收集起來放到服務器的/home/git/.ssh/authorized_keys文件裏就是可行的。如果團隊有幾百號人,就沒法這麼玩了,這時,可以用Gitosis來管理公鑰。

這裏我們不介紹怎麼玩Gitosis了,幾百號人的團隊基本都在500強了,相信找個高水平的Linux管理員問題不大。

管理權限
有很多不但視源代碼如生命,而且視員工爲竊賊的公司,會在版本控制系統裏設置一套完善的權限控制,每個人是否有讀寫權限會精確到每個分支甚至每個目錄下。因爲Git是爲Linux源代碼託管而開發的,所以Git也繼承了開源社區的精神,不支持權限控制。不過,因爲Git支持鉤子(hook),所以,可以在服務器端編寫一系列腳本來控制提交等操作,達到權限控制的目的。Gitolite就是這個工具。

以上內容來自廖雪峯前輩的Git學習教程總結,僅作爲學習複習用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章