天天看點

廖雪峰git學習筆記廖雪峰git學習筆記

廖雪峰git學習筆記

建立版本庫

初始化一個Git倉庫,1.

cd 檔案夾

2. 使用

git init

指令。

添加檔案到Git倉庫

  1. 使用指令

    git add <file>

    ,注意,可反複多次使用,添加多個檔案;
  2. 使用指令

    git commit -m <message>

    ,完成

檢視工作區的狀态

  1. 要随時掌握工作區的狀态,使用

    git status

    指令。
  2. 如果

    git status

    告訴你有檔案被修改過,用

    git diff

    可以檢視修改内容。

版本回退

  • HEAD

    指向的版本就是目前版本,是以,Git允許我們在版本的曆史之間穿梭,使用指令

    git reset --hard commit_id

  • 穿梭前,用

    git log

    可以檢視送出曆史,以便确定要回退到哪個版本。

    git log --pretty=oneline

  • 要重返未來,用

    git reflog

    檢視指令曆史,以便确定要回到未來的哪個版本。

工作區和暫存區

工作區: 自己工作的地方,存放代碼的檔案夾

暫存區: 修改内容暫時存放的區域,相當于

git add

操作之後,将工作區的修改内容添加到暫存區

目前分支: git分支所在的地方,

git commit

指令就是将暫存區的内容提到到目前分支上

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

第一步是用

git add

把檔案添加進去,實際上就是把檔案修改添加到暫存區;

第二步是用

git commit

送出更改,實際上就是把暫存區的所有内容送出到目前分支。

因為我們建立Git版本庫時,Git自動為我們建立了唯一一個

master

分支,是以,現在,

git commit

就是往

master

分支上送出更改。

你可以簡單了解為,需要送出的檔案修改通通放到暫存區,然後,一次性送出暫存區的所有修改。

管理修改

每次修改之後,需要

git add

然後再

git commit

将修改之後的内容送出到分支上,如果修改之後,不進行

git add

操作,然後直接

git commit

則隻是将暫存區的修改送出到分支上,工作區的修改并沒有進行送出

撤銷修改

場景1:當你改亂了工作區某個檔案的内容,想直接丢棄工作區的修改時,用指令

git checkout -- file

場景2:當你不但改亂了工作區某個檔案的内容,還添加到了暫存區時,想丢棄修改,分兩步,第一步用指令

git reset HEAD <file>

,就回到了場景1,第二步按場景1操作。

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

删除檔案

指令

git rm

用于删除一個檔案。如果一個檔案已經被送出到版本庫,那麼你永遠不用擔心誤删,但是要小心,你隻能恢複檔案到最新版本,你會丢失最近一次送出後你修改的内容。

遠端倉庫

第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有

id_rsa

id_rsa.pub

這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:

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

如果一切順利的話,可以在使用者主目錄裡找到

.ssh

目錄,裡面有

id_rsa

id_rsa.pub

兩個檔案,這兩個就是SSH Key的秘鑰對,

id_rsa

是私鑰,不能洩露出去,

id_rsa.pub

是公鑰,可以放心地告訴任何人。

第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:

然後,點“Add SSH Key”,填上任意Title,在Key文本框裡粘貼

id_rsa.pub

檔案的内容:

git checkout -- file

就是讓這個檔案回到最近一次

git commit

(版本庫中檢出)或

git add

(暫存區)時的狀态

為什麼GitHub需要SSH Key呢?因為GitHub需要識别出你推送的送出确實是你推送的,而不是别人冒充的,而Git支援SSH協定,是以,GitHub隻要知道了你的公鑰,就可以确認隻有你自己才能推送。

當然,GitHub允許你添加多個Key。假定你有若幹電腦,你一會兒在公司送出,一會兒在家裡送出,隻要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。

添加遠端庫

要關聯一個遠端庫,使用指令

git remote add origin [email protected]:path/repo-name.git

關聯後,使用指令

git push -u origin master

第一次推送master分支的所有内容;

此後,每次本地送出後,隻要有必要,就可以使用指令

git push origin master

推送最新修改

從遠端庫克隆

要克隆一個倉庫,首先必須知道倉庫的位址,然後使用

git clone

指令克隆。

Git支援多種協定,包括

https

,但通過

ssh

支援的原生

git

協定速度最快。

分支管理

建立與合并分支

檢視分支:

git branch

建立分支:

git branch <name>

切換分支:

git checkout <name>

建立+切換分支:

git checkout -b <name>

合并某分支到目前分支:

git merge <name>

在分支開發完成之後,切換到

master

分支,然後在

master

分支上進行合并,将

<name>

分支合并到

master

分支上

删除分支:

git branch -d <name>

解決沖突

當Git無法自動合并分支時,就必須首先解決沖突。解決沖突後,再送出,合并完成。

解決沖突就是把Git合并失敗的檔案手動編輯為我們希望的内容,再送出。

git log --graph

指令可以看到分支合并圖。

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

可以檢視簡短分支合并圖

分支管理政策

通常,合并分支時,如果可能,Git會用

Fast forward

模式,但這種模式下,删除分支後,會丢掉分支資訊

git merge --no-ff -m "merge with no-ff" dev

: 準備合并

dev

分支,請注意

--no-ff

參數,表示禁用

Fast forward

在實際開發中,我們應該按照幾個基本原則進行分支管理:

首先,

master

分支應該是非常穩定的,也就是僅用來釋出新版本,平時不能在上面幹活;

那在哪幹活呢?幹活都在

dev

分支上,也就是說,

dev

分支是不穩定的,到某個時候,比如1.0版本釋出時,再把

dev

分支合并到

master

上,在

master

分支釋出1.0版本;

你和你的小夥伴們每個人都在

dev

分支上幹活,每個人都有自己的分支,時不時地往

dev

分支上合并就可以了。

Bug分支

應用場景:目前任務還未完成,不能立即送出工作,但是目前有一個緊急的問題需要進行解決,可以先将目前工作區的内容進行儲存,然後建立分支,進行解決問題,問題解決之後,可以恢複現場,繼續之前的工作

git stash

: 把目前未完成的工作現場進行儲存起來,等到以後可以恢複現場繼續工作

git stash list

: 檢視所有現場

git stash apply [email protected]{0}

: 恢複指定的現場

git stash pop

:恢複的同時把stash内容也删了

git stash drop

:删除現場

Feature 分支

開發一個新feature,最好建立一個分支;

如果要丢棄一個沒有被合并過的分支,可以通過

git branch -D <name>

強行删除。

多人協作

  • 檢視遠端庫資訊,使用

    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

    ,如果有沖突,要先處理沖突。

Rebase

  • rebase操作可以把本地未push的分叉送出曆史整理成直線;
  • rebase的目的是使得我們在檢視曆史送出的變化時更容易,因為分叉的送出需要三方對比。

标簽管理

釋出一個版本時,我們通常先在版本庫中打一個标簽(tag),這樣,就唯一确定了打标簽時刻的版本。将來無論什麼時候,取某個标簽的版本,就是把那個打标簽的時刻的曆史版本取出來。是以,标簽也是版本庫的一個快照。

Git的标簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,标簽不能移動),是以,建立和删除标簽都是瞬間完成的。tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。

建立标簽

  • 指令

    git tag <tagname>

    用于建立一個标簽,預設為

    HEAD

    ,也可以指定一個commit id;
  • 指令

    git tag -a <tagname> -m "blablabla..." commit id

    可以指定标簽資訊,在哪一次送出的id上進行打标簽;
  • 指令

    git tag

    可以檢視所有标簽。
  • 指令

    git show <tagname>

    可以看到說明文字

操作标簽

  • 指令

    git push origin <tagname>

    可以推送一個本地标簽;
  • 指令

    git push origin --tags

    可以推送全部未推送過的本地标簽;
  • 指令

    git tag -d <tagname>

    可以删除一個本地标簽;
  • 指令

    git push origin :refs/tags/<tagname>

    可以删除一個遠端标簽。

使用github

在GitHub上看到别人比較好的項目的時候,想要自己進行修改,需要先

Fork

到自己的賬号下,然後在自己賬号下面進行

clone

之後就可以進行修改

  • 在GitHub上,可以任意Fork開源倉庫;
  • 自己擁有Fork後的倉庫的讀寫權限;
  • 可以推送pull request給官方倉庫來貢獻代碼

忽略特殊檔案

  • 忽略某些檔案時,需要編寫

    .gitignore

  • .gitignore

    檔案本身要放到版本庫裡,并且可以對

    .gitignore

    做版本管理!

配置别名

git config --global alias.st status

:将status使用别名st進行表示

很多人都用

co

表示

checkout

ci

表示

commit

br

表示

branch

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch      

git config --global alias.unstage 'reset HEAD'

暫存區的修改撤銷掉(unstage),重新放回工作區。

git config --global alias.last 'log -1'

配置一個

git last

,讓其顯示最後一次送出資訊:

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"      

git log

顯示的效果更加好看一些

配置Git的時候,加上

--global

是針對目前使用者起作用的,如果不加,那隻針對目前的倉庫起作用。

每個倉庫的Git配置檔案都放在

.git/config

檔案中。

别名就在

[alias]

後面,要删除别名,直接把對應的行删掉即可。

而目前使用者的Git配置檔案放在使用者主目錄下的一個隐藏檔案

.gitconfig