Git的常用命令
Git常用命令彙總以及其它相關操作
一、常用的git命令
--檔案目錄操作命令
1 mkdir * 建立一個空目錄 *指目錄名
2 pwd 顯示當前目錄的路徑。
3 cat * 檢視*檔案內容
4 git rm * 刪除**檔案
--git初始化操作
1 git init 把當前的目錄變成git倉庫,生成隱藏.git檔案。
2 git remote add origin url 把本地倉庫的內容推送到GitHub倉庫。
3 git clone git@url/test.git 從遠端庫克隆
4 git add * 把x檔案新增到暫存區去。
5 git commit –m "*" 提交檔案 –m 後面的是註釋。
--git 克隆分支
1 git clone xxx.git 最簡單直接的命令
2 git clone xxx.git "指定目錄" clone到指定目錄
3 git clone -b branchname xxx.git clone時建立新的分支替代預設Origin HEAD(master)
--clone 遠端分支
git clone 命令預設的只會建立master分支,如果你想clone指定的某一遠端分支(如:dev)的話,可以如下:
1. 檢視所有分支(包括隱藏的) git branch -a 顯示所有分支
1 * master
2 remotes/origin/HEAD -> origin/master
3 remotes/origin/dev
4 remotes/origin/master
2. 在本地新建同名的("dev")分支,並切換到該分支
1 git checkout -t origin/dev 該命令等同於:
2 git checkout -b dev origin/dev
--檢視命令
1 git status 檢視倉庫狀態
2 git diff * 檢視X檔案修改了那些內容
3 git log 檢視歷史記錄
4 git reflog 檢視歷史記錄的版本號id(記錄你的每一次命令,不論是否提交)
5 git log --pretty=oneline 如果資訊量太多可以進行比較好的列表顯示
--版本回退
1 git reset –hard HEAD^ 回退到上一個版本
2 git reset --hard HEAD~第幾個 如果想回退到第3個版本,使用git reset –hard HEAD~3
3 git reset --hard 057d 回退到某一個具體的版本號
--撤銷修改
1 git checkout file-name 恢復某個已修改的檔案(撤銷未提交的修改):
2 git revert HEAD 還原最近一次提交的修改:
3 git revert commit-id 還原指定版本的修改
--分支管理
1 git branch 檢視本地所有的分支
2 git branch -a 檢視遠端所有的分支
3 git branch name 建立分支
4 git branch –d dev 刪除dev分支
5 git push origin --delete dev 刪除遠端的dev分支
6 git branch -m dev develop 重新命名分支
7 git checkout –b dev 建立dev分支 並切換到dev分支上
8 git merge dev 在當前分支上合併dev分支代
9 git push origin zyf-dev 把當前新疆的zyf-dev分支推送到遠端庫(遠端倉庫沒有給分支則會新建立該分支)
10 git checkout — * 把XX檔案在工作區的修改全部撤銷。
11 git checkout master 切換回master分支
12 git push --set-upstream origin dev 提交修改並建立遠端分支dev
--tag相關操作
1 git tag 列出所有的tag
2 git tag name 打輕量標籤 name
3 git tag -d name 刪除本地的tag
4 git push origin --delete tag name 刪除遠端的tag
5 git show name 檢視tag資訊
6 git push origin name 將tag提交到遠端
--隱藏的檔案
1 git stash 把當前的工作隱藏起來 等以後恢復現場後繼續工作
2 git stash list 檢視所有被隱藏的檔案列表
3 git stash apply 恢復被隱藏的檔案,但是內容不刪除
4 git stash drop 刪除檔案
5 git stash pop 恢復檔案的同時 也刪除檔案
--檢視遠端庫資訊(git remote的用法)
1 git remote 檢視遠端庫的資訊
2 git remote –v 檢視遠端庫的詳細資訊
3 git remote add name url 新增遠端倉庫
4 git remote rename oldname newname 重新命名倉庫
5 git remote rm 刪除倉庫
--將遠端分支拉取到本地
1 方法一:git checkout -b 本地分支名x origin/遠端分支名x
2 方式二:git fetch origin 遠端分支名x:本地分支名x
--git pull操作
1 git pull命令的作用是,取回遠端主機某個分支的更新,再與本地的指定分支合併,基本的格式如下。
2 $ git pull <遠端主機名> <遠端分支名>:<本地分支名>
3
4 取回origin主機的next分支,與本地的master分支合併,需要寫成下面這樣
5 $ git pull origin next:master
6
7 如果遠端分支是與當前分支合併,則冒號後面的部分可以省略。
8 $ git pull origin next
9
10 上面命令表示,取回origin/next分支,再與當前分支合併。實質上,這等同於先做git fetch,再做git merge。
11 $ git fetch origin
12 $ git merge origin/next
13
14 在某些場合,Git會自動在本地分支與遠端分支之間,建立一種追蹤關係(tracking)。比如,在git clone的時候,所有本地分支預設與遠端主機的同名分支,建立追蹤關係,也就是說,本地的master分支自動”追蹤”origin/master分支。
15 Git也允許手動建立追蹤關係。
16 git branch --set-upstream master origin/next
17
18 上面命令指定master分支追蹤origin/next分支。如果當前分支與遠端分支存在追蹤關係,git pull就可以省略遠端分支名。
19 $ git pull origin
--git 設定大小寫敏感
Windows上的Git預設是大小寫不敏感的,這樣多平臺寫作就可能會出現問題。Win上的Git設定為大小寫敏感的命令如下
1 git config core.ignorecase false
--git 設定忽略檔案或資料夾許可權修改
1 git config core.filemode false
--建立追蹤分支
不帶任何引數的git push,預設只推送當前分支,這叫做simple方式。此外,還有一種matching方式,會推送所有有對應的遠端分支的本地分支。Git 2.0版本之前,預設採用matching方法,現在改為預設採用simple方式。如果要修改這個設定,可以採用git config命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple (最好使用這種方式)
--切換git 命令提示中文到英文
// ubuntu裝的git不知道怎麼就出現全中文的提示,不太好,果斷切換到中文了,切換方法如下:
// 1:寫入
echo "alias git='LANG=en_GB git'" >> ~/.bashrc
// 2:生效
source ~/.bashrc
--git 刪除未新增到版本中的檔案或者資料夾
git checkout 只能回退在版本中的修改或者刪除, 對於新新增的檔案是沒有作用的, 也就是說, 新建的檔案或者資料夾是:Untracked files, 要刪除或者清理掉這些檔案,需要使用 git clean 命令:
1 // 刪除 untracked files
2 git clean -f
3
4 // 連 untracked 的目錄也一起刪掉
5 git clean -fd
6
7 // 連 gitignore的untrack 檔案/目錄也一起刪掉 (一般這個是用來刪掉編譯出來的 .o一類的檔案)
8 git clean -xfd
9
10 // 在使用清理 git clean之前,建議加上 -n 來先看看會刪掉哪些檔案,防止重要檔案被誤刪
11 git clean -nxfd
12 git clean -nf
13 git clean -nfd
三、常出錯誤:
1:There is no tracking information for the current branch...
則說明本地分?支和遠端分?支的連結關係沒有建立,用命令:
git branch --set-upstream branch-name origin/branch-name。
2: ![rejected] dev -> dev (non-fast-forward) ... Updates were rejected because the tip of your current branch
推送失敗,因為遠端程式碼的最新提交和你試圖推送的提交有衝突,解決辦法也很簡單,先用git pull把最新的提交從origin/dev抓下來,然後,在本地合併,解決衝突,再推送
3:CONFLICT (content): Merge conflict in . . .
nbsp;這回git pull成功,但是合併有衝突,需要手動解決,解決的方法和分支管理中的解決衝突一樣。解決後,提交,再push:
4: You are not currently on a branch, so I cannot use any
解決辦法:git checkout master
5:Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
上面的顯示的意思是,有一個更新還沒有反應到本地來,可能是別人往server上提交了一點東西。
可以使用git pull命令拿這些更新到本地來。
6:在執行 git push 時可能會看到如下訊息:
warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use: git config --global push.default matching To squelch this message and adopt the new behavior now, use: git config --global push.default simpl
解決辦法:‘matching’ 引數是 Git 1.x 的預設行為,如果你執行 git push 但沒有指定分支,它將 push 所有你本地的分支到遠端倉庫中對應匹配的分支。而 Git 2.x 預設的是 simple,意味著執行 git push 沒有指定分支時,只有當前分支會被 push 到你使用 git pull 獲取的程式碼。
根據提示,修改git push:
1 git config --global push.default matching
再次執行git push 就行了。
7:You asked to pull from the remote 'origin', but did not specify:a branch. Because this is not the default configured remotefor your current branch, you must specify a branch on the command line.
解決辦法:找到:.git/config 修改如下
1 [branch "master"]
2 remote = origin
3 merge = refs/heads/master
8:ERROR: Permission to user1/test.git denied to user2 fatal: The remote end hung up unexpectedly
賬戶衝突,下面有針對講解
9: 新增的ssh不起作用?
ssh 的新增一定要在root使用者許可權在新增,其他的許可權不起作用,切記!
四、經驗之談:
1:git revert 和 git reset的區別
開始感覺兩者一樣,但是在客戶端和命令列視窗操作之後發現大大的不同,看一個例子:我先提交三次1,2,3 id號分別是(15d5f70,a167eb1,8fbfe3f)如下圖
然後執行版本回退 git reset –hard a167 如圖:
說明執行git reset –hard ** 版本回退是撤銷某次提交,但是此次之後的修改都會被退回到暫存區,因為上面顯示有提交(by 1 commit)
同理執行 git revert –hard a167
git revert是用一次新的commit來回滾之前的commit
在回滾操作上看,效果一樣。但是在日後繼續merge以前的老版本時有區別。revert是用一次逆向的commit“中和”之前的提交,因此日後合併老的branch時,導致這部分改變不會再次出現,但是reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。
得到結論:git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,
只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
這樣在版本回退的時候就比較的好,比如本地dev分支,遠端master分支,某一次的上線發現線上有重大的bug,然後你reset原生程式碼到前一個版本,在你git push 的時候git會報一個錯誤:“說你的本地分支版本低於遠端master分支的版本,讓你先去pull 下來程式碼,再提交”,這就不行了,你pull下來的程式碼還是最新版有bug的程式碼,不進行pull程式碼,master分支又不讓你提交。解決這個問題還得使用 revert 來進行 “回退”操作,為什麼加引號呢,是因為這種回退是向前提交一次中和了上次的修改,這就比較好了,這樣你revert之後相當於指標向前移動一次,本地版本dev高於遠端master版本,這時你就可以git push 原生程式碼到遠端了。也就是說,git reset 對未提交到(git push)遠端的修改做回滾比較好,如果要回滾本地,同時想遠端也回滾,就要用到revert
五、常用修改:
1:避免每次提交都輸入使用者名稱和密碼
原因是使用了https方式 puh 在termail裡邊 輸入 git remote -v 可以看到形如一下的返回結果
origin https://github.com/git/librarysystem.git(fetch)
origin https://github.com/git/librarysystem.git(push)
下面把它換成ssh方式的。
1. git remote rm origin
2. git remote add origin git@github.com:yu/demo.git
3. git push origin
2:新增忽略檔案 .gitignore
.gitignore配置檔案用於配置不需要加入版本管理的檔案。
配置語法: "/" 開頭表示目錄; "*" 通配多個字元; "?" 通配單個字元 "[]" 包含單個字元的匹配列表; "!" 表示不忽略(跟蹤)匹配到的檔案或目錄;
說明:git 對於 .ignore 配置檔案是按行從上到下進行規則匹配的,意味著如果前面的規則匹配的範圍更大,則後面的規則將不會生效;
示例:(1) foder/* 忽略目錄foder下的全部內容,不管是根目錄下的 /foder/ 目錄,還是某個子目錄 /list/foder/ 目錄,都會被忽略。
(2) /foder/* 說明:忽略根目錄下的 /foder/ 目錄的全部內容;
(3) /*!.gitignore
!/fw/bin/
!/fw/sf/
說明:忽略全部內容,但是不忽略 .gitignore檔案,根目錄下的 /fw/bin/ 和 /fw/sf/
注意問題: .gitignore檔案只對還沒有加入版本管理的檔案起作用,如果之前已經用git把要忽略的檔案納入了版本庫,就不起作用了。
3:如何在同一臺電腦上使用兩個git賬戶
問題描述:作為程式設計師有時候是有多個的專案,而且每個專案git的使用者名稱,郵箱等,都不一樣。就我來說,我在github上有一個賬號,自己開發一些東西,同時我參與的也有專案需要連線別人的github賬號,在我電腦上只有一個git客戶端,本地一個身份使用者,開始的時候我自己開發是用ssh方式,參與的專案的是用https連線,但是https每次都需要輸入密碼,非常不方便,所以想轉成ssh連線,利用命令:
>$ git remote rm origin
>$ git remote add origin git@github.com:yu/demo.git
>$ git push origin
轉換成功,不幸的是push的時候出錯了:ERROR: Permission to user1 denied to
這種情況的解決方式是方法,使用本地託管多個個ssh的金鑰,不同的賬號是用不同的密匙。
第一步:生成SSH Key
執行命令,如下圖:
具體說明:
1 $ ssh-keygen -t rsa -C "your_email@youremail.com"
2 Creates a new ssh key using the provided email Generating public/private rsa key pair.
3 #輸入將要儲存的路徑,我的預設為當前路徑(/c/Users/zhaoyafei/.ssh/id_rsa),但是不能使用預設檔案id_rsa,要新增新賬戶就要生起一個成新的好記的名字,例如id_rsa_work
4 Enter file in which to save the key (/c/Users/zhaoyafei/.ssh/id_rsa):
5 #輸入回車後提示輸入一個類似於密碼的號,直接回車就行
6 Enter passphrase (empty for no passphrase):
7 Enter same passphrase again:
第二步:識別新的私鑰
預設SSH只會讀取id_rsa,所以為了讓SSH識別新的私鑰,需要將其新增到SSH agent
1 ssh-add ~/.ssh/id_rsa_work
2 //該命令如果報錯:Could not open a connection to your authentication agent.可執行 ssh-agent bash 命令後再執行ssh-add -l 看是否成功。
執行命令,如下圖:
第三步:修改config檔案
該檔案用於配置私鑰對應的伺服器。內容如下:
1 # Default github (預設的)
2 Host github.com
3 HostName github.com
4 User git
5 IdentityFile ~/.ssh/id_rsa
6
7 # second user(work@gmail.com)
8 Host github_work
9 HostName github.com
10 User git
11 IdentityFile ~/.ssh/id_rsa_work
這樣配置,也就是使用hostname為github.com會根據使用者名稱的不同,去使用不用的private key。github上,也可以新增對應的公鑰。其實這個配置是關於ssh的與git無關,只是git使用的方式是ssh的方式。Host可隨意,方便自己記憶,後續在新增remote是還需要用到。
第四步:將SSH key輸入到GitHub網站中
將生成的id_rsa_work.pub輸入到GitHub網站中就可以了,輸入完成後單擊Add key後,會看到git-tutorial已經被新增進去了。 配置完成後,在連線非預設帳號的github倉庫時,遠端庫的地址要對應地做一些修改,比如現在新增abc帳號下的一個倉庫test,則需要這樣新增:git remote add test git@github-work:abc/test.git #並非原來的git@github.com:abc/test.git 這樣每次連線都會使用id_rsa_abc與伺服器進行連線。
注意:github根據配置檔案的user.email來獲取github帳號顯示author資訊,所以對於多帳號使用者一定要記得將user.email改為相應的email(work@mail.com)。我遇到的問題是本地單一使用者,連結不同的github賬號,所以使用者配置可以採用全域性配置。如果不同本地使用者(不同的身份標識,即需要本地使用不同的使用者名稱),那麼git就不要使用有–global的配置,可以按照下面的方法:
1 1)設定區域性的user.name和user.email
2 git config user.name "xxxxxx"
3 git config user.email "xxx@xxx.com"
4 2)設定全域性的user.name和user.email
5 git config --global user.name "xxxxxx"
6 git config –-global user.email ""
六、題外話(相關概念)
Git - 版本控制工具
Git是一個開源的分散式版本控制系統,用以有效、高速的處理從很小到非常大的專案版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。Torvalds 開始著手開發 Git 是為了作為一種過渡方案來替代 BitKeeper,後者之前一直是 Linux 核心開發人員在全球使用的主要原始碼工具。開放原始碼社群中的有些人覺得 BitKeeper 的許可證並不適合開放原始碼社群的工作,因此 Torvalds 決定著手研究許可證更為靈活的版本控制系統。儘管最初 Git 的開發是為了輔助 Linux 核心開發的過程,但是我們已經發現在很多其他自由軟體專案中也使用了 Git。例如 最近就遷移到 Git 上來了,很多 Freedesktop 的專案也遷移到了 Git 上。
Github - 一個網站,提供給使用者空間建立git倉儲,儲存使用者的一些資料文件或者程式碼等
作為開原始碼庫以及版本控制系統,Github目前擁有140多萬開發者使用者。隨著越來越多的應用程式轉移到了雲上,Github已經成為了管理軟體開發以及發現已有程式碼的首選方法。如前所述,作為一個分散式的版本控制系統,在Git中並不存在主庫這樣的概念,每一份複製出的庫都可以獨立使用,任何兩個庫之間的不一致之處都可以進行合併。GitHub可以託管各種git庫,並提供一個web介面,但與其它像 SourceForge或Google Code這樣的服務不同,GitHub的獨特賣點在於從另外一個專案進行分支的簡易性。為一個專案貢獻程式碼非常簡單:首先點選專案站點的“fork”的按 鈕,然後將程式碼檢出並將修改加入到剛才分出的程式碼庫中,最後通過內建的“pull request”機制向專案負責人申請程式碼合併。已經有人將GitHub稱為程式碼玩家的MySpace。
GitLab - 基於Git的專案管理軟體
GitLab 是一個用於倉庫管理系統的開源專案。使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務。三者都是基於git的,可以說是git的衍生品。