天天看點

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操作

Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作
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常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作

--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 branch --track  master origin/master //在使用 git branch 指令時加上 \'--track\' 參數, 來手動建立一個追蹤分支

--切換git 指令提示中文到英文

Git常用指令彙總以及其它相關操作
// ubuntu裝的git不知道怎麼就出現全中文的提示,不太好,果斷切換到中文了,切換方法如下:
// 1:寫入
echo "alias git=\'LANG=en_GB git\'" >> ~/.bashrc

// 2:生效
source ~/.bashrc      
Git常用指令彙總以及其它相關操作

--git 删除未添加到版本中的檔案或者檔案夾

git checkout 隻能回退在版本中的修改或者删除, 對于新添加的檔案是沒有作用的, 也就是說, 建立的檔案或者檔案夾是:Untracked files, 要删除或者清理掉這些檔案,需要使用 git clean 指令:

Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作
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      
Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作

三、常出錯誤:

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 . . .

    這回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      
Git常用指令彙總以及其它相關操作

  解決辦法:‘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常用指令彙總以及其它相關操作

然後執行版本回退 git reset –hard a167 如圖:

Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作

說明執行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 [email protected]: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 [email protected]:yu/demo.git 

>$ git push origin       

轉換成功,不幸的是push的時候出錯了:ERROR: Permission to user1 denied to

這種情況的解決方式是方法,使用本地托管多個個ssh的密鑰,不同的賬号是用不同的密匙。

第一步:生成SSH Key

執行指令,如下圖:

Git常用指令彙總以及其它相關操作

具體說明:

Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作
1 $ ssh-keygen -t rsa -C "[email protected]"
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:      
Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作

第二步:識别新的私鑰

    預設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 看是否成功。      

執行指令,如下圖:

Git常用指令彙總以及其它相關操作

第三步:修改config檔案

    該檔案用于配置私鑰對應的伺服器。内容如下:

Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作
1 # Default github (預設的)
 2       Host github.com
 3       HostName github.com
 4       User git
 5       IdentityFile ~/.ssh/id_rsa
 6 
 7 # second user([email protected])
 8       Host github_work
 9       HostName github.com
10       User git
11       IdentityFile ~/.ssh/id_rsa_work      
Git常用指令彙總以及其它相關操作
Git常用指令彙總以及其它相關操作

       這樣配置,也就是使用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 #并非原來的[email protected]:abc/test.git 這樣每次連接配接都會使用id_rsa_abc與伺服器進行連接配接。

  注意:github根據配置檔案的user.email來擷取github帳号顯示author資訊,是以對于多帳号使用者一定要記得将user.email改為相應的email([email protected])。我遇到的問題是本地單一使用者,連結不同的github賬号,是以使用者配置可以采用全局配置。如果不同本地使用者(不同的身份辨別,即需要本地使用不同的使用者名),那麼git就不要使用有–global的配置,可以按照下面的方法:

Git常用指令彙總以及其它相關操作
1 1)設定局部的user.name和user.email
2     git config user.name "xxxxxx"
3     git config user.email "[email protected]"
4 2)設定全局的user.name和user.email
5     git config --global user.name "xxxxxx"
6     git config –-global user.email ""      
Git常用指令彙總以及其它相關操作

六、題外話(相關概念)

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的衍生品。

Git常用指令彙總以及其它相關操作