本文內容參考了廖雪峯老師的博文,並作了適當整理,方便你們查閱。git
git init
git init
咱們新建一個文本文件readme.txt
github
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 GPL
)bash
git reset
當前所處的位置爲HEAD
,若是咱們但願回退到上一步(即add distribute
),能夠用HEAD^
來表示。上兩步是HEAD^^
,以此類推。app
git reset --hard HEAD^
查看文件,內容已經更改回版本2了。ssh
此時咱們再用git log
查看歷史記錄:ide
發現版本3
已經不見了,這時若是想再回復回去還有辦法麼?答案固然是確定的,只要你記得commit id
,隨時能夠用如下命令穿梭回去。學習
git reset --hard acc1d
注:這裏的acc1d
是commit 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-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
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的參考資料,會不斷豐富內容,也但願可以對你們有幫助。