Git 經常使用命令

不會命令可使用 TortoiseGit 或者 SourceTreegit

經常使用命令

  1. 建立本地倉庫
    git init --bare shared.git (或者 git init)
  2. 配置我的信息
    git config user.name "wangli"
    git config user.email "user@qq.com"
    或者
    git config --global user.name "wangli"
    git config --global user.email "user@qq.com"
  3. cat index.jsp
    4.echo "this is test file" > index.jsp
  4. 複製倉庫到本地
    git clone /f/software/repository/git/shared.git/ .
    (注意有個點,代表當前目錄)
    git clone git@github.com:wangli0/appdemo.git .或者 (git clone git@github.com:wangli0/appdemo.git)
  5. mkdir learngit
  6. pwd //顯示當前路徑
  7. git status
    命令可讓咱們時刻掌握倉庫當前的狀態
  8. 未提交
    $ git diff readme.txt (diff --> difference)
    【使用時機,修改readme.txt,但尚未準備提交(還未add commit),想看看這次修改和上次提交的區別】
    提交後
    git diff HEAD -- readme.txt
    命令能夠查看工做區和版本庫裏面最新版本的區別github

  9. git status掌握工做區的狀態
  10. git log (顯示從最近到最遠的提交日誌)
    ~~~ 若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline~~~ (git log --pretty=oneline)web

  11. 版本回退
    git reset --hard HEAD^
    或者 指定回退的commit對象的id
    ($ git reset --hard 3628164)版本號不必寫全,git會自動找Git中,用HEAD
    表示當前版本,上一個版本就是HEAD^
    ,上上一個版本就是HEAD^^,再往上就是 HEAD~100數據庫

  12. git log穿梭前,能夠查看提交歷史,以便肯定要回退到哪一個版本
    要重返將來,用git reflog
    查看命令歷史,以便肯定要回到將來的哪一個版本
  13. git checkout -- readme.txt把readme.txt
    文件在工做區的修改所有撤銷
    --很重要,沒有的話就變成了「切換到另外一個分支」的命令
    兩種狀況
    一種是readme.txt自修改後尚未被放到暫存區,
    如今,撤銷修改就回到和版本庫如出一轍的狀態;
    (還不如再次git pull一次或者 直接vim readme.txt)【改變的是工做區內容】

    一種是readme.txt已經添加到暫存區後,又在工做區做了修改xx ,如今,撤銷修改就回到 剛剛git add到暫存區時的狀態暫存區還在bootstrap

  14. git reset HEAD readme.txt
    把暫存區的修改撤銷掉(unstage)[暫存區不復存在],從新放回工做區vim

  15. 刪除文件(注,git中刪除也是修改操做)
    rm index.jsp git rm index.jsp git status git commit -m "remove index.jsp"安全

  16. github 的使用
    因爲你的本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的
    需建立 SSH key
    $ ssh-keygen -t rsa -C "youremail@example.com"服務器

  17. touch readme.md 建立一個空文件網絡

  18. 重點
    不管是
    (1)從遠程克隆
    (2)或者是本地項目提交到github 都須要先在github上面建立一個倉庫app

    (用的多,此種方式連README.md都不能建立【空倉庫】,一旦建立,本地和遠程版本就不一致了,須要先pull才能夠)
    方法1省略
    方法2
    echo # Appdemo >> README.md git initgit add README.md git commit -m "first commit" git remote add origin git@github.com:wangli0/Appdemo.gitgit push -u origin master
    注意:用git push命令,其實是把當前分支master推送到遠程。因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來
    移除關聯 git remote rm origin(若是關聯已經添加,再次添加會報錯)

  19. git checkout -b dev 建立dev分支,-b參數表示 建立並切換
    git checkout -b dev
    等價於<===>
    git branch dev (建立分支 dev) git checkout dev (切換到dev分支) git branch 列出當前的分支

  20. 合併分支 && 刪除分支
    如 當前的分支是 master
    git merge dev // 把dev分支合併到當前分支(默認是Fast-forward快進模式 也就是直接把master 指向dev的當前提交,因此合併速度很是快。) git branch -d dev //如今能夠刪除 dev分支了
  21. 合併分支形成的衝突
    例子:
    步驟1
    master 分支
    git add a.jsp git commit a.jsp -m "the content is a"
    dev 分支
    git add a.jsp git commit a.jsp -m "the content is aaaa"
    步驟2
    合併分支
    $ git merge dev // 衝突產生,兩分支同時修改了一行 , git status查看 衝突的文件
    步驟3
    修改衝突:
    vim a.jsp git add a.jsp git commit -m "conflict fixed" (commit不加文件名哦)
  22. git log --graph --pretty=oneline --abbrev-commit
    查看 分支的合併狀況
    刪除分支 git branch -d dev

  23. git log --graph
    命令能夠看到分支合併圖
  24. 合併分支 續
    git merge dev(快進模式) git merge --no-ff -m "merge with no-ff" dev
  25. 查看分支歷史 git log
    git log --graph --pretty=oneline --abbrev-commit
  26. 合併分支時,加上--no-ff
    參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward
    合併就看不出來曾經作過合併。
  27. *** bug分支***

    1.正在 dev分支上工做,此時需修復bug
    git stash (保存當前的工做區如 修改index.jsp文件或 git add index.jsp文件 可是尚未提交 commit)
    1. 切換到修復bug的分支 如 master
      git checkout master
    2. 建立bug分支
      git checkout -b issue-101 (在此上面修復bug)
    3. 修復完成後,切換到master分支,合併分支issue-101,並刪除issue-101分支
      git checkout master
      git merge --no-ff -m "merged bug fix 101" issue-101
      git branch -d issue-101
    4. 是時候接着回到dev分支幹活了
      git checkout dev (git status 發現 working directory clean工做區是空的 )
    5. git stash list 查看工做現場存哪裏了
    6. 恢復工做區
      方式1
      git stash apply (恢復後,stash內容並不刪除)
      方式2
      git stash pop (恢復的同時把stash內容也刪了)
    7. 你能夠屢次stash,恢復的時候,先用git stash list
      查看,而後恢復指定的stash,用命令:
      $ git stash apply stash@{0}
  28. 標籤
    git tag v1.0 (標籤就是快照,在當前最新commit上打了一個快照)
    或者針對 某個commit id 打標籤
    git tag v1.0 622222(622222是commit id)

  29. 查看標籤列表
    git tag
  30. 查看標籤信息
    git show v1.0 (git show <tagname>)
  31. 建立 帶有說明的標籤
    git tag -a v1.0 -m "version1.0的標籤" 6222222
  32. 操做標籤
    git tag -d v1.0 刪除標籤 (由於建立的標籤都只存儲在本地,不會自動推送到遠程。因此,打錯的標籤能夠在本地安全刪除。)
    git push origin v1.0 (git push origin
    )推送某個標籤 到遠程倉庫
    git push origin --tags//推送本地全部爲推送的 標籤到遠程
    刪除已經推送到遠程的標籤
    git tag -d v1.0 git push origin :refs/tags/v1.0 //注意格式
  33. git config --global color.ui true//Git顯示顏色,會讓命令輸出看起來更醒目

  34. feature分支(和bug分支,普通分支徹底同樣,主要用於開發新功能)

    1.git checkout -b feature-1 新建分支,並編寫完成新功能
    1. git checkout dev (切換開發分支)
    2. git branch -d feature-1
      一切順利的話,feature分支和bug分支是相似的,合併,而後刪除
    3. 可是不順利事情是常有的(忽然因經費問題被叫停 )
      分支尚未被合併,若是刪除,將丟失掉修改,若是要強行刪除,須要使用命令git branch -D feature-1(合併後 的分支刪除方法是git branch -d feature-1 小寫)
      丟棄一個沒有被合併過的分支,能夠經過git branch -D
      強行刪除
  35. 推送分支
    git push origin master // 指定本地分支 master->遠程master
    git push origin dev //指定本地分支 dev ->遠程 dev
    遠程庫clone時候 //默認只能clone到遠程分支的master分支

    我須要在dev分支上開發,就必須建立遠程origin的dev分支到本地
    git checkout -b dev origin/dev

  36. 兩人同時push 產生衝突
    一樣的一個文件 index.jsp ,兩人都作了修改

    人1: 先git push index.jsp -m "update a file"
    人2: git push index.jsp -->出現衝突

    緣由: 由於你的小夥伴的最新提交和你試圖推送的提交有衝突
    解決方案:

    人2 : git pull
    把最新的提交從origin/dev抓下來,而後,在本地合併,解決衝突,再推送
    注意: pull的時候 須要指定 本地 dev分支與 遠程 origin/dev分支的連接 git branch --set-upstream dev origin/dev

  37. git remote -v 查看 遠程庫信息


注意事項

  • 從本地推送分支,使用git push origin branch-name
    ,若是推送失敗,先用git pull
    抓取遠程的新提交

  • 本地新建的分支若是不推送到遠程,對其餘人就是不可見的
  • git pull命令,不能在同一個用戶下面git pull獲得本身剛剛提交的,會提示當前文件已是最新的,pull 不下來
  • 直接在遠程客戶端 web上面更新a 文件,在電腦上面就能夠git pull獲得剛剛更新的代碼
  • 不一樣的用戶目錄(本地倉庫如user1,user2)默認都有一個master分支
  • git checkout
    實際上是用版本庫裏的版本替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」
  • github 上面 的 pull request用於你fork了別人的項目,而後修改fork後的代碼,想提交到 別人的項目裏面,就須要點擊 pull request
  • 研究發現,如APPdemo文件夾下,git init 初始化本地倉庫
    git add ,git commit,都是在當前文件夾下面進行的
    只有git push推送到遠程倉庫(或者本機其餘目錄下的倉庫中[也算遠程倉庫,只不過是離線的遠程倉庫])
    前提是須要關聯本地倉庫 與遠程倉庫
    *** git clone 命令時候 默認會作一次關聯
    沒有管理的話,須要咱們本身手動關聯***

  • 可是無論遠程倉庫(net) 遠程倉庫(本機),本地倉庫(某一個文件夾)本質上都是倉庫

  • 當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成

  • master分支是主分支,所以要時刻與遠程同步;
    dev分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;

    bug分支只用於在本地修復bug,就不必推到遠程了,除非老闆要看看你每週到底修復了幾個bug;

    feature分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。

  • 標籤是爲了打上版本號信息,固然不能亂叫,一般用:
    v1.0, v1.1, v2.0 ...
    或者按發佈日期:
    build-20150702, build-20150910 ...

  • 若是你想修復bootstrap的一個bug,或者新增一個功能,馬上就能夠開始幹活,幹完後,往本身的倉庫推送。

    若是你但願bootstrap的官方庫能接受你的修改,你就能夠在GitHub上發起一個pull request。固然,對方是否接受你的pull request就不必定了。

  • 有些時候,你必須把某些文件放到Git工做目錄中,但又不能提交它們,好比保存了數據庫密碼的配置文件啦,等等,每次git status
    都會顯示Untracked files ...
    ,有強迫症的童鞋內心確定不爽。
    好在Git考慮到了你們的感覺,這個問題解決起來也很簡單,在Git工做區的根目錄下建立一個特殊的.gitignore
    文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。
    不須要從頭寫.gitignore
    文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:https://github.com/github/gitignore

    如忽略
    Python編譯產生的.pyc
    .pyo
    .dist
    等文件或目錄:

  • git 工做區 和暫存區 各個分支用的是同一個,僅僅提交的時候因爲指針指的地方不一樣,令咱們感受彷佛在不一樣區間上面工做,且git限定咱們 工做區間被修改(如 index.jsp 被修改或被git add可是未 commit) 此時 git是不容許git checkout (切換分支的)

  • 注意關聯遠程倉庫 和 關聯 遠程分支
    **關聯遠程倉庫** git remote add origin git@github.com:wangli0/Appdemo.gitgit **關聯遠程分支** git branch --set-upstream dev origin/dev


某教程裏面的簡單命令

==============版本管理員操做========================
第一步: 建立數據倉庫
git init --bare shared.git
==============開發人員1操做=============================
第二步:複製倉庫到本地
git clone /f/software/repository/git/shared.git/ . (注意有個點,代表當前目錄)
第三步:設置我的信息
git config user.name "user1"
git config user.email "user1@163.com"
第四步:忽略無需版本控制的文檔
echo ".txt" > .gitignore
第五步:新建一個文件
echo "User1 add content" > index.jsp
第六步:提交文件
git add index.jsp
git commit -m "User1 add the file"
第七步:把本身的倉庫提交到公共服務器
git push origin master
==============開發人員2操做=============================
第八步:複製倉庫到本地
git clone /f/software/repository/git/shared.git/ .
第九步:設置我的信息
git config user.name "user2"
git config user.email "user2@163.com"
第十步:忽略無需版本控制的文檔
echo "
.txt" > .gitignore
第十一步:新建一個文件
echo "User2 add content" >> index.jsp
第十二步:提交文件
git add index.jsp
git commit -m "User2 add the file!"
第十三步:把本身的倉庫提交到公共服務器
git push origin master
==============開發人員1操做=============================
第十四步:下載服務器最新數據
git pull


 網絡上面別人對git的一些理解

大白話講解如何給github上項目貢獻代碼

  1. 最最開始,我覺得git clone [項目地址],也就是把代碼clone下來 而後修改,而後push到項目裏就能夠了。後來發現,這種狀況只適合該項目屬於你本身的狀況,若是你git clone別人的項目代碼,你想push都push不上去,由於 git push 不是須要你輸入github賬號密碼麼。
  2. 而後 我就知道了 github上 不是有個fork麼, 好,那麼給別人的項目提交代碼的方式就有了,先fork下別人的代碼,因而你的github上就出現了同名的項目,這個項目就屬於你本身了,你把這個本身的項目git clone到本地,修修改改,而後push到你本身的項目裏,那麼你如何把你對本身項目的改動,給發到以前fork的那個原項目呢,看見了沒,在github上你的項目頁面有個按鈕,叫Pull request,對 你點它就會把你的修改發到對方的項目裏,人還會收到郵件呢,由原項目主人決定是否接受你的修改。可是,這樣問題就出來了,在你fork他的項目以後,若是他又更新了代碼,你本身fork的項目怎麼作到和原項目同步呢? 我就想啊,是否是 我還得從新git clone原項目的代碼,而後手動合併到我fork的項目裏呢。。。梁老師說,你丫這太蛋疼了,確定不是這麼麻煩,我細想,也是啊,這不2麼。。。
  3. 而後,從《Pro git》上看到一個知識點,我擦,github竟然能夠給項目添加合做者,也就是說,假如你,對,說你呢,戴眼鏡那個,你想參與個人項目,你跟我說一聲,我就把你添加到個人項目裏做爲合做者,這個選項在項目的設置裏面有,只要我添加你了,你就能夠git clone個人代碼而後修修改改,而後直接push上來就好了,就不用fork那麼麻煩了,若是你要更新服務器代碼,只要git pull就好了,看 合做者這東西多方便,就像咱們在公司用svn似的。
  4. 而後我就想啊,有了合做者還須要你丫fork這個功能幹啥?仔細一想,你寫個好項目,不能隨便加合做者啊,加了個熊孩子把你代碼改廢了可咋整,這年頭熊孩子不少,我本身不就是一個麼。因此fork確定仍是須要,fork就是專門預防熊孩子的,這就是真相!那麼前面說道到fork以後如何與原項目同步的問題還在啊,沒有獲得解決。
  5. 因而《Pro git》再次給了我一個解答,具體流程是你啊想給個人項目作貢獻,你先git clone個人代碼到本地,而後修修改改,而後你不是不能push到個人項目裏麼,你能夠先在github頁面上fork個人項目,有了你本身的項目地址(url)以後呢,你在本地操做git remote add [sort name] [your url],意思就是添加第二個遠程倉庫地址,這個倉庫的「暱稱」就是你剛指定的[sort name],而後,你以後push文件呢 就經過指定這個[sort name]來push到這個你本身的倉庫裏。等你以爲想要把你改的發給原項目同步,就在你的項目上點Pull request按鈕.說下另外一種狀況,若是是,原項目發生了改動,你要想同步到本地,就直接從git fetch origin 從原項目的地址同步代碼,而後再merge就行了。固然,如《Pro git》上所寫,你能夠經過新建分支的方式往本身的項目上push,這樣同步的時候直接fetch就好了。

使用git在本地建立一個項目的過程

$ mkdir ~/hello-world    //建立一個項目hello-world 
 $ cd ~/hello-world       //打開這個項目  
 $ git init //初始化     
 $ touch README    
 $ git add README        //更新README文件    
 $ git commit -m 'first commit'     //提交更新,並註釋信息「first commit」   
 $ git remote add origin [git@github.com:defnngj/hello-world.git](mailto:git@github.com:defnngj/hello-world.git)     //鏈接遠程github項目      
 $ git push -u origin master     //將本地項目更新到github項目上去

git 常見錯誤

fatal: remote origin already exists.
若是輸入$ git remote add origin
git@github.com:djqiang(github賬號名)/gitdemo(項目名).git

提示出錯信息:fatal: remote origin already exists.
解決辦法以下:
一、先輸入$ git remote rm origin
二、再輸入$ git remote add origin [git@github.com:djqiang/gitdemo.git](mailto:git@github.com:djqiang/gitdemo.git) 就不會報錯

一張圖告訴你 git的最 經常使用命令

Paste_Image.png

技巧篇

漂亮的 log界面
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

最近一次的提交
git config --global alias.last 'log -1' //等價 git log -1

配置文件
配置Git的時候,加上--global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。

配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中

cat .git/config

難點篇

git stash命令 stash(隱藏,藏匿)

使用場景:

當你接到一個修復一個bug的任務時,建立一個分支issue-101
來修復它,可是當前正在dev
上進行的工做只進行到一半,還無法提交,可是此時 必須在兩個小時內修復該bug,怎麼辦?

Git還提供了一個stash
功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做

使用說明:

使用git stash就能夠將你當前未提交到本地(和服務器)的代碼推入到Git的棧中,這時候你的工做區間和上一次提交的內容是徹底同樣的,因此你能夠放心的修 Bug,等到修完Bug,提交到服務器上後,再使用git stash apply將之前一半的工做 應用回來

也許有的人會說,那我可不能夠屢次將未提交的代碼壓入到棧中?答案是能夠的。
當你屢次使用'git stash'命令後,你的棧裏將充滿了未提交的代碼,這時候你會對將哪一個版本應用回來有些困惑,'git stash list'命令能夠將當前的Git棧信息打印出來,你只須要將找到對應的版本號,
例如使用git stash apply stash@{1}就能夠將你指定版本號爲stash@{1}的工做取出來,當你將全部的棧都應用回來的時候,可使用'git stash clear'來將棧清空。
在這裏順便提下git format-patch -n , n是具體某個數字, 例如
git format-patch -1這時便會根據log生成一個對應的補丁,若是 git format-patch -2那麼便會生成2個補丁,固然前提是你的log上有至少有兩個記錄

看過上面的信息,就能夠知道使用場合了:當前工做區內容已被修改,可是並未完成。
這時Boss來了,說前面的分支上面有一個Bug,須要當即修復。

但是我又不想提交目前的修改,由於修改沒有完成。

可是,不提交的話,又沒有辦法checkout到前面的分支。此時用Git Stash就至關於備份工做區 了。

而後在Checkout過去修改,就可以達到保存當前工做區,並及時恢復的做用。

多人協做小結

  • 查看遠程庫信息,使用git remote -v;
  • 本地新建的分支若是不推送到遠程,對其餘人就是不可見的;
  • 從本地推送分支,使用git push origin branch-name,若是推送失敗,先用git pull抓取遠程的新提交;
  • 在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
  • 創建本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
  • 從遠程抓取分支,使用git pull,若是有衝突,要先處理衝突。
相關文章
相關標籤/搜索