Git學習筆記 - 鋼鋼更新

參考資料

本文內容參考了廖雪峯老師的博文,並作了適當整理,方便你們查閱。git

經常使用命令

倉庫初始化 - git init

git init

咱們新建一個文本文件readme.txtgithub

Git is a distributed version control system.
Git is free software.

將文件添加到倉庫中 - git add

git add .

將文件提交到倉庫 - git commit

git commit -m "wrote a readme file"

查看倉庫狀態 - git status

git status

對比文件區別 - git diff

對文件內容進行簡單修改並保存,這時還未提交(commit)到倉庫,若是這時咱們但願對比一下自從上次提交後,該文件發生了哪些變化,能夠用git diff命令實現。緩存

git diff readme.txt

注: diff比較的是當前未提交( commit)的版本跟上一個版本之間的差異。一旦 commit到倉庫,就沒法比較了。

查看日誌 - git log

git log

咱們經過git log命令能夠清楚地看到以前提交的版本。這裏的一大串數字叫commit id。咱們能夠清楚地看到當前HEAD便是當前位置(append GPLbash

回退版本 - git reset

當前所處的位置爲HEAD,若是咱們但願回退到上一步(即add distribute),能夠用HEAD^來表示。上兩步是HEAD^^,以此類推。app

git reset --hard HEAD^

查看文件,內容已經更改回版本2了。ssh

此時咱們再用git log查看歷史記錄:ide

發現版本3已經不見了,這時若是想再回復回去還有辦法麼?答案固然是確定的,只要你記得commit id,隨時能夠用如下命令穿梭回去。學習

git reset --hard acc1d
注:這裏的 acc1dcommit id的前幾位,不須要寫全,git會自動匹配。

再次git log查看一下:fetch

查看全部歷史記錄 - git reflog

若是你忘記了以前的commit id也沒關係,能夠用過git reflog來查找。url

git reflog

撤銷工做區修改 - git checkout -- filename

假設如今咱們又修改了文件內容。
readme.txt

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.

這時咱們保存了,但尚未提交到緩衝區。用git status查看,git提示文件已修改。

這時,咱們能夠用git checkout -- filename撤銷修改就回到和版本庫如出一轍的狀態。

結論:
  • 若是文件還沒被提交到緩衝區,git checkout -- filename撤銷修改就回到和版本庫如出一轍的狀態;
  • 若是文件已經被提交到緩衝區,git checkout -- filename撤銷修改就回到添加到暫存區後的狀態;
注: git checkout -- filename命令中的 --很重要,沒有 --,就變成了「切換到另外一個分支」的命令。

撤銷緩衝區修改 - git reset

git reset HEAD filename命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD時,表示最新的版本。

這時若是還想撤銷緩存區的修改,一樣運行git checkout -- filename便可。

刪除文件 - git rm filename

當你刪除了本地文件後,可能有兩種狀況:

  • 你確認要刪除該文件,不管本地仍是代碼庫;
  • 本地誤操做,想要從代碼庫回覆;

若是是第一種狀況,能夠用以下命令:

git rm test.txt

再用git commit把正式提交刪除便可。

git commit -m "delete test.txt"

若是是第二種狀況,能夠簡單地用git checkout命令回退。

git checkout -- test.txt

遠端倉庫

將本地倉庫關聯到遠程倉庫 - git remote add origin [your repo url]

在Github上新建一個倉庫,例如:learngit

Github會提示你能夠將本地的倉庫(目錄)跟新建的倉庫關聯起來。
這裏的https://github.com/wfg2513148/learngit.git是剛剛建立的倉庫,origin是遠程倉庫默認的名字,通常看到origin字樣就知道是遠程庫。

git remote add origin https://github.com/wfg2513148/learngit.git
git push -u origin master
~/Desktop/learngit(master) » git push -u origin master
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 820 bytes | 820.00 KiB/s, done.
Total 9 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To github.com:wfg2513148/learngit.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
注:當時在推送到遠端倉庫時遇到了如下異常:
~/Desktop/learngit(master) » git push -u origin master
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

能夠嘗試如下方法解決:

從新生成ssh-key並綁定到Github上

運行ssh-keygen -t rsa -C "wfgdlut@gmail.com" 須要替換成你本身的Github帳號郵箱。

~/Desktop/learngit(master) » ssh-keygen -t rsa -C "wfgdlut@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/kwang/.ssh/id_rsa):
/Users/kwang/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/kwang/.ssh/id_rsa.
Your public key has been saved in /Users/kwang/.ssh/id_rsa.pub.

查看生成好的公鑰文件內容,本例中的爲/Users/kwang/.ssh/id_rsa.pub

將公鑰內容原封不動的添加到Github上(Settings -> SSH and GPG keys -> New SSH key

若是仍是報錯,繼續如下步驟。

顯式指定遠端倉庫路徑 - git remote set-url origin [your repo url]

git remote set-url origin [YOUR REPO] 明確指定遠端倉庫,再次推送,應該就能夠了。

git remote set-url origin git@github.com:wfg2513148/learngit.git

克隆遠端倉庫 - git clone [your repo url]

git clone git@github.com:wfg2513148/gitskills.git

分支

建立新分支 - git checkout -b [new branch name]

git checkout -b dev

-b參數表示建立完馬上切換,至關於執行了如下兩條命令:
git branch dev
git checkout dev

查看分支 - git branch

切換分支 - git branch [branch name]

git branch master

合併分支

Fast-forward模式 - git merge [branch name merged]

當前咱們處在master分支,如今想把dev分支合併到master分支上

git merge dev

能夠看到,當前合併模式是Fast-forward,即快進模式,合併速度很是快。Git分支合併還有其餘的模式。

留痕模式 - git merge --no-ff -m "no-ff merge" [branch name merged]

咱們可使用--no-ff參數來合併,這樣會保留合併歷史分支的痕跡。

能夠看到,dev分支的信息被保留下來了。

刪除分支

正常刪除分支 - git branch -d [branch name]

git branch -d feture1

強行刪除分支 - `git branch -D [branch name]`

git branch -D feture1

臨時分支

建立臨時分支 - git stash

有時候咱們手頭的工做還沒作完,代碼尚未提交(add & commit),但臨時有其餘事情要作,須要切換分支。這時候可使用臨時分支把當前工做進展儲存起來,以便有空的時候「恢復」回來。

git stash

能夠看到當前工做狀況已經被儲存起來了,這時候能夠放心地切換分支了。

查看全部臨時分支 - git stash list

git stash list

恢復臨時分支內容 - git stash apply

當緊急工做作完後,從新切換回dev分支,取回臨時分支中的工做。

git stash apply
注: git stash apply僅僅恢復臨時分支的內容,並不會主動刪除stash。須要用 git stash drop來刪除。

刪除臨時分支 - git stash drop

git stash drop

恢復同時刪除臨時分支 - git stash pop

git stash pop

多人協做

查看遠端分支 - git remote

git remote

遠端倉庫默認名稱是origin

查看遠端分支詳情 - git remote -v

git remote -v

根據當前訪問權限,能夠看到fetch抓取地址以及push推送地址。

推送分支 - git push origin master

注: 這裏的origin master表明要將本地內容推送到遠端倉庫(origin)的 master 分支上。

並非全部的本地分支都要推送到遠端的,推送原則:

  • master主幹分支,應該時刻與遠端保持同步;
  • dev開發分支,也要保持與遠端同步;
  • bug分支,能夠保持在本地便可;
  • feature特性分支,是否要推送取決於你是否要跟他人協做;

拉取分支

遠端倉庫

git clone git@github.com:wfg2513148/gitskills.git

這時當咱們查看分支時,值能看到本地的master分支

git branch

在本地建立遠端分支

git checkout -b dev origin/dev

若是在提交的時候報衝突(其餘人已經提交了),能夠先用git pull抓取最新的代碼,在本地合併後再推送。

若是git pull提示no tracking information,說明本地分支和遠端分支沒有連接起來,這時候能夠用如下語句完成連接:

git branch --set-upstream branch-name origin/branch-name

標籤管理

建立標籤

標籤的做用就是方便快速切換分支,建立標籤也很簡單,直接git tag v1.0就能夠生成一個標籤。

git tag v1.0

查看全部標籤

git tag

補打標籤

先查出要打標籤的commit id,再運行命令補打標籤。

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

好比咱們但願對conflict fiexed補打標籤,找到對應的commit id是20adf59

補打標籤:

git tag v0.9 20adf59

再次查看標籤:

git tag

能夠看到標籤並非按照時間順序顯示的。

經過git show <tagname>進一步查看標籤內容

git show v0.9

能夠用-a指定標籤名,-m指定說明文字。

git tag -a v0.1 -m "version 0.1 released" 53fe235

再次查看標籤詳情git tag v0.1

刪除標籤

git tag -d v0.1

推送標籤到遠端分支

git push origin v1.0

一次性推送所有還沒有推送的標籤

git push origin --tags

刪除遠端標籤

若是標籤已經推送到遠端,須要先刪除本地標籤:

git tag -d v0.9

而後再刪除遠端標籤,格式以下:

git push origin :refs/tags/v0.9

結語

本文做爲我的學習Git的參考資料,會不斷豐富內容,也但願可以對你們有幫助。

相關文章
相關標籤/搜索