Git教程--廖雪峰


Git簡介

1、Git是目前世界上最先進的分布式版本控制系統(沒有之一)
2、集中式和分布式版本控制系統有什么區別呢?
     區別在於歷史版本維護的位置: Git本地倉庫包含代碼庫還有歷史庫,在本地的環境開發就可以記錄歷史; 而SVN的歷史庫存在於中央倉庫,每次對比與提交代碼都必須連接到中央倉庫才能進行。 這樣的好處在於: 自己可以在脫機環境查看開發的版本歷史; 多人開發時如果充當中央倉庫的Git倉庫掛了, 可以隨時創建一個新的中央庫然后同步就立刻恢復了中央庫

安裝Git

1、linux上安裝Git
      sudo apt-get install git
2、windows上安裝Git
       msysgit是Windows版的Git,從 https://git-for-windows.github.io 下載 ,然后按默認選項安裝即可。
      打開Git Bash既是
3、自報家門
        $ git config --global suer.name "pony"
        $ git config --global user.email "pony@126.com"

創建版本庫

1、創建方法:

創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄(確保目錄名不包含中文)
$ cd D:/doc/
$ mkdir learngit
$ cd learngit/
$ pwd

/d/doc/learngit
2、 通過 git init 命令把這個目錄變成Git可以管理的倉庫

$ git init

Initialized empty Git repository in d:/doc/learngit/.git/
3、把文件添加到版本庫中
※不要用windows默認編輯器,編碼有問題,建議使用notepad++,而且默認編碼設置為 UTF-8 without BOM既可
 任務:將readme.txt添加到Git
    (1) readme.txt加到倉庫(即放到項目的文件夾下  ) 
    (2) $ git add readme.txt
    (3)$ git commit -m "wrote a redme    //-m是本次提交的說明
[master (root-commit) bd23402]
 1 file changed, 2 insertions(
 create mode 100644 readme.txt

4、為什么有add和commit?

    因為可以add多個文件之后,再commit

時光機穿梭

查看狀態

  • 要隨時掌握工作區的狀態,使用git status命令。

  • 如果git status告訴你有文件被修改過,用git diff可以查看修改內容。

zlm@ZLM-PC /d/Doc/learngit (master)
$ git status
On branch master
nothing to commit, working directory clean
zlm@ZLM-PC /d/Doc/learngit (master)
//修改了readme.txt后再次查看狀態
$ 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
        modified:   readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
 
$ git diff readme.txt        //查看到底修改了什么
WARNING: terminal is not fully functional
diff --git a/readme.txt b/readme.txt
index 084d42e..37bbe8d 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system
+Git is a distributed version control system
 Git is a free software
\ No newline at end of file

版本回退

  • HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。

  • 要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

commit后面的一長串數字是commit_id(版本號) 。HEAD是最新版本,HEAD^是上一版本,HEAD^^是上上版本, HEAD~100是前100個版本
 
返回上一版本:
$ git reset --hard HEAD^
HEAD is now at 5ba7890 add distributed
 
返回某一個指定版本,只需要寫版本號前幾位就行,git會自動找到
$ git reset --hard bd2340
HEAD is now at bd23402 wrote a redme file
 
$ git reflog        //用來記錄每一次命令
WARNING: terminal is not fully functional
bd23402 HEAD@{0}: reset: moving to bd2340
5ba7890 HEAD@{1}: reset: moving to HEAD^
17dc2d4 HEAD@{2}: commit: append GPL
5ba7890 HEAD@{3}: commit: add distributed
bd23402 HEAD@{4}: commit (initial): wrote a redme file

工作區和緩存區

git add之后:
git commit之后:

 管理修改

每次修改,如果不 add 到暫存區,那就不會加入到 commit
git diff HEAD -- readme.txt 命令可以查看工作區和版本庫里面最新版本的區別

撤銷修改

場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file

場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。 

刪除文件

從版本庫恢復文件:
$ git checkout -- test.txt
刪除版本庫中的文件:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt" [master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt

遠程倉庫

 

GitHub

1、注冊一個github賬號( https://github.com/ ) ,就可以獲得git遠程倉庫
2、 創建SSH Key 。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有 id_rsa id_rsa.pub 這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:
$ ssh-keygen -t rsa -C "lingzeng86@126.com"
然后一路回車,使用默認值即可,由於這個Key也不是用於軍事目的,所以也無需設置密碼。
如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
3、 登陸GitHub,打開“Account settings”,“SSH Keys”頁面, 點“Add SSH Key”,填上任意Title,在Key文本框里粘貼 id_rsa.pub 文件的內容,就可以了。

添加遠程庫

1、在GitHub添加一個倉庫名字為“learngit”
2、本地庫與 GitHub做關聯
         $ git remote add origin git @github . com:zenglingming /learngit.git
         origin是固定用法,表示遠程倉庫      
3、本地庫所有內容推送到遠程庫
        $ git push -u origin master
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?  yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of know
n hosts.
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.65 KiB | 0 bytes/s, done.
Total 20 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To git@github.com:zenglingming/learngit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.       
    把本地庫的內容推送到遠程,用 git push 命令,實際上是把當前分支 master 推送到遠程。

   由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。

 從現在起,只要本地作了提交,就可以通過命令:

$ git push origin master 
把本地 master 分支的最新修改推送至GitHub,現在,你就擁有了真正的分布式版本庫!        
※上圖中的SSH警告只會出現一次,是因為需要吧 GitHub的Key添加到本機的一個信任列表里, 以后不會再有。

從遠程庫克隆

1、在GitHub創建一個新倉庫,名字叫gitskills,可以勾選上“ Initialize this repository with a README
2、 git clone git @github . com:zenglingming /gitskills.git
    
 當然也可以用 https://github.com/zenglingming/gitskills 的htpps協議也可以clone,但除了速度慢之外,每次推送還需要輸入口令。而ssh支持的原生git協議是最快的。

分支管理

Git的創建分、切換和分支速度很快,1秒鍾內就能完成!

創建與合並分支

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000

Git鼓勵大量使用分支:

查看分支:git branch

創建分支:git branch <name>

切換分支:git checkout <name>

創建+切換分支:git checkout -b <name>

合並某分支到當前分支:git merge <name>

刪除分支:git branch -d <name>

解決沖突

當branch和master都有新的提交,branch合並到master時,會有沖突,這就需要手動解決。
用帶參數的 git log 也可以看到分支的合並情況:
$ git log --graph --pretty=oneline --abbrev-commit
*   59bc1cb conflict fixed
|\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...

分支管理策略

 

Git分支十分強大,在團隊開發中應該充分應用。

合並分支時,加上--no-ff參數就可以用普通模式合並,合並后的歷史有分支,能看出來曾經做過合並,而默認的fast forward合並就看不出來曾經做過合並。

1、創建並切換到dev分支: git checkout -b dev
2、修改readme.txt,提交
         $ git add readme.txt
         $ git commit -m "add merge"
3、切換回master: $ git checkout master
4、普通模式合並dev分支        
         $ git merge --no-ff -m "merge with no-ff" dev
5、查看分支歷史
         $ git log --graph --pretty=oneline --abbrev-commit

Bug分支

1、在dev正常開發中,有一個bug要解決,先用stash功能吧當前工作現場“存儲”起來
         $ git stash
2、 git status 查看工作區,就是干凈的(除非有沒有被Git管理的文件)
3、從master拉取bug分支,如:issue-101,修改之后,commit
4、切換到master,合並分支issue-101,然后刪除分支issue-101
5、切換到dev分支,查看保存的工作現場
         $ git stash list
         stash@{ 0 } : WIP on dev: 6224937 add merge
6、恢復工作現場
        方法1: git stash apply 恢復,但是恢復后,stash內容並不刪除,你需要用 git stash drop 來刪除
        方法2: git stash pop ,恢復的同時把stash內容也刪了
※查看保存的工作現場,然后可以恢復指定的stash
$ git stash list $ git stash apply stash@{0}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM