Git的常用命令


Git常用命令匯總以及其它相關操作

一、常用的git命令

       --文件目錄操作命令

 mkdir *   創建一個空目錄 *指目錄名
 pwd       顯示當前目錄的路徑。
 cat *     查看*文件內容
 git rm *  刪除**文件

       --git初始化操作

    git init                   把當前的目錄變成git倉庫,生成隱藏.git文件。
    git remote add origin url  把本地倉庫的內容推送到GitHub倉庫。
    git clone git@url/test.git 從遠程庫克隆
    git add *                  把x文件添加到暫存區去。
    git commit –m "*"          提交文件 –m 后面的是注釋。   

       --git 克隆分支

    git clone xxx.git                最簡單直接的命令
    git clone xxx.git "指定目錄"      clone到指定目錄
    git clone -b branchname xxx.git  clone時創建新的分支替代默認Origin HEAD(master)

      --clone 遠程分支

       git clone 命令默認的只會建立master分支,如果你想clone指定的某一遠程分支(如:dev)的話,可以如下:

            1. 查看所有分支(包括隱藏的)  git branch -a 顯示所有分支    

           * master
           remotes/origin/HEAD -> origin/master
           remotes/origin/dev
           remotes/origin/master

                2. 在本地新建同名的("dev")分支,並切換到該分支

           git checkout -t origin/dev 

#該命令等同於: git checkout
-b dev origin/dev

     --查看命令

   git status        查看倉庫狀態
   git diff  *       查看X文件修改了那些內容   
   git log           查看歷史記錄
   git reflog        查看歷史記錄的版本號id(記錄你的每一次命令,不論是否提交)
   git log --pretty=oneline 如果信息量太多可以進行比較好的列表顯示   

     --版本回退

   git reset –hard HEAD^       回退到上一個版本
   git reset --hard HEAD~第幾個 如果想回退到第3個版本,使用git reset –hard HEAD~3
   git reset --hard 057d       回退到某一個具體的版本號

     --撤銷修改

   git checkout file-name 恢復某個已修改的文件(撤銷未提交的修改):
   git revert HEAD        還原最近一次提交的修改:
   git revert commit-id   還原指定版本的修改

     --分支管理

   git branch                           查看本地所有的分支
   git branch -a                        查看遠程所有的分支
   git branch name                      創建分支
   git branch –d dev                    刪除dev分支
   git push origin --delete dev         刪除遠程的dev分支
   git branch -m dev develop            重命名分支
   git checkout –b dev                  創建dev分支 並切換到dev分支上
   git merge dev                        在當前分支上合並dev分支代
   git push origin zyf-dev              把當前新增的zyf-dev分支推送到遠程庫(遠程倉庫沒有給分支則會新建立該分支)
   git checkout — *                     把XX文件在工作區的修改全部撤銷。
   git checkout master                  切換回master分支
   git push --set-upstream origin dev   提交修改並創建遠程分支dev

    --tag相關操作

   git tag                            列出所有的tag
   git tag name                       打輕量標簽 name
   git tag -d name                    刪除本地的tag
   git push origin --delete tag name  刪除遠程的tag
   git show name                      查看tag信息
   git push origin name               將tag提交到遠程

    --隱藏的文件

   git stash                          把當前的工作隱藏起來 等以后恢復現場后繼續工作
   git stash list                     查看所有被隱藏的文件列表
   git stash apply                    恢復被隱藏的文件,但是內容不刪除
   git stash drop                     刪除文件
   git stash pop                      恢復文件的同時 也刪除文件

    --查看遠程庫信息(git  remote的用法) 

   git remote                         查看遠程庫的信息
   git remote –v                      查看遠程庫的詳細信息
   git remote add  name url           添加遠程倉庫
   git remote rename oldname newname  重命名倉庫
   git remote rm                      刪除倉庫

    --將遠程分支拉取到本地

   #方法一
git checkout -b 本地分支名x origin/遠程分支名x
#方法二
git fetch origin 遠程分支名x:本地分支名x

     --git pull操作

   #git pull命令的作用是,取回遠程主機某個分支的更新,再與本地的指定分支合並,基本的格式如下:
   $ git pull <遠程主機名> <遠程分支名>:<本地分支名>

   #取回origin主機的next分支,與本地的master分支合並,需要寫成下面這樣
   $ git pull origin next:master

   #如果遠程分支是與當前分支合並,則冒號后面的部分可以省略。
   $ git pull origin next

   #上面命令表示,取回origin/next分支,再與當前分支合並。實質上,這等同於先做git fetch,再做git merge。
   $ git fetch origin
   $ git merge origin/next

   #在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關系(tracking)。
#比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關系,也就是說,本地的master分支自動”追蹤”origin
/master分支。 #Git也允許手動建立追蹤關系。 $ git branch --set-upstream master origin/next #上面命令指定master分支追蹤origin/next分支。如果當前分支與遠程分支存在追蹤關系,git pull就可以省略遠程分支名。 $ git pull origin

    --git 設置大小寫敏感

        Windows上的Git默認是大小寫不敏感的,這樣多平台寫作就可能會出現問題。Win上的Git設置為大小寫敏感的命令如下

    git config core.ignorecase false  

    --git 設置忽略文件或文件夾權限修改

    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 命令提示中文到英文 

   // ubuntu裝的git不知道怎么就出現全中文的提示,不太好,果斷切換到中文了,切換方法如下:
   // 1:寫入
   echo "alias git='LANG=en_GB git'" >> ~/.bashrc

   // 2:生效
   source ~/.bashrc

    --git 刪除未添加到版本中的文件或者文件夾

        git checkout 只能回退在版本中的修改或者刪除, 對於新添加的文件是沒有作用的, 也就是說, 新建的文件或者文件夾是:Untracked files, 要刪除或者清理掉這些文件,需要使用 git clean 命令:

   // 刪除 untracked files
   git clean -f
 
   // 連 untracked 的目錄也一起刪掉
   git clean -fd
 
   // 連 gitignore的untrack 文件/目錄也一起刪掉 (一般這個是用來刪掉編譯出來的 .o一類的文件)
   git clean -xfd
 
   // 在使用清理 git clean之前,建議加上 -n 來先看看會刪掉哪些文件,防止重要文件被誤刪
   git clean -nxfd
   git clean -nf
   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 . . .
          這回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:

     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  修改如下

     [branch "master"]
      remote = origin
      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方式的。

      git remote rm origin
      git remote add origin git@github.com:yu/demo.git
      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

                執行命令,如下圖:

                

              具體說明:

       $ ssh-keygen -t rsa -C "your_email@youremail.com"
       Creates a new ssh key using the provided email Generating public/private rsa key pair.
       #輸入將要保存的路徑,我的默認為當前路徑(/c/Users/zhaoyafei/.ssh/id_rsa),但是不能使用默認文件id_rsa,要添加新賬戶就要生起一個成新的好記的名字,例如id_rsa_work
       Enter file in which to save the key (/c/Users/zhaoyafei/.ssh/id_rsa):
       #輸入回車后提示輸入一個類似於密碼的號,直接回車就行
       Enter passphrase (empty for no passphrase):
       Enter same passphrase again:

             第二步:識別新的私鑰
                默認SSH只會讀取id_rsa,所以為了讓SSH識別新的私鑰,需要將其添加到SSH agent   

       ssh-add ~/.ssh/id_rsa_work
      //該命令如果報錯:Could not open a connection to your authentication agent.可執行 ssh-agent bash 命令后再執行ssh-add -l 看是否成功。

            第三步:修改config文件
               該文件用於配置私鑰對應的服務器。內容如下:

       # Default github (默認的)
         Host github.com
         HostName github.com
         User git
         IdentityFile ~/.ssh/id_rsa

       # second user(work@gmail.com)
         Host github_work
         HostName github.com
         User git
         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)設置局部的user.name和user.email
     git config user.name "xxxxxx"
     git config user.email "xxx@xxx.com"

2)設置全局的user.name和user.email git config --global user.name "xxxxxx" 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的衍生品。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM