git常用命令

git常用命令

這篇文章將來介紹一下git常用命令。

創(chuàng)建版本庫

  • 在c盤創(chuàng)建一個目錄,例如 learngit
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
  • 通過git init 變成git可以管理的目錄。

    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
    

這樣倉庫就建立好了。

  • 然后建立文件然后添加到版本庫。例如:建立readme.txt 文件。保存到learngit 目錄。

    $ git add readme.txt
    
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

版本回退

  • 可以使用$ git log 來查看命令。

  • 在git中用HEAD來表示當(dāng)前版本,用HEAD來表示上一個版本,用HEAD^來表示上上一個版本。用HEAD~100來表示上100個版本。

  • 版本回退命令

    $ git reset --hard HEAD^
    HEAD is now at e475afc add distributed
    

    也可以使用

    $ git reset --hard 1094a
    HEAD is now at 83b0afe append GPL
    

    其中1094a 是部分版本號。$ git reflog 可以用來查看自己的每一個版本號。

  • $ git status 可以用來查看狀態(tài)。

撤銷修改

  • git checkout -- file可以丟棄工作區(qū)的修改。例如:

    $ git checkout -- readme.txt
    

    用命令git reset HEAD <file>可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū):

    $ git reset HEAD readme.txt
    Unstaged changes after reset:
    M    readme.txt
    

刪除文件

  • 若創(chuàng)建了一個文件并提交了上去。例如:創(chuàng)建了一個新文件test.txt 到git并提交了。

    這樣可以執(zhí)行

$ rm test.txt
$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
這樣文件就從版本庫里刪除了。

另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本:

$ git checkout -- test.txt

GitHub上創(chuàng)建自己的遠程倉庫

  • 首先配置好自己的GitHub網(wǎng)站然后輸入命令,使自己的本地倉庫可以上傳到遠程倉庫中。
$ git remote add origin git@github.com:michaelliao/learngit.git

? 其中michaelliaoGitHub用戶名。

? 下一步,就可以把本地庫的所有內(nèi)容推送到遠程庫上:

$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

從現(xiàn)在起,只要本地作了提交,就可以通過命令:

$ git push origin master

把本地master分支的最新修改推送至GitHub,現(xiàn)在,你就擁有了真正的分布式版本庫!

遠程庫克隆

  • 假設(shè)你有一個新的倉庫gitskills,可以使用git clone命令來克隆到本地倉庫。

    $ git clone git@github.com:michaelliao/gitskills.git
    Cloning into 'gitskills'...
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
    Receiving objects: 100% (3/3), done.
    

創(chuàng)建分支

  • $ git checkout -b dev
    Switched to a new branch 'dev'
    

    相當(dāng)于

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'
    

    git branch命令查看當(dāng)前分支:

    $ git branch
    * dev
      master
    

    例如修改之后然后提交

    $ git add readme.txt 
    $ git commit -m "branch test"
    [dev b17d20e] branch test
     1 file changed, 1 insertion(+)
    

    然后可以切換后master分支上

    $ git checkout master
    Switched to branch 'master'
    

    然后你就會發(fā)現(xiàn)原來的修改不見了?,F(xiàn)在,我們把dev分支的工作成果合并到master分支上:

    $ git merge dev
    Updating d46f35e..b17d20e
    Fast-forward
     readme.txt | 1 +
     1 file changed, 1 insertion(+)
    

    這樣就會發(fā)現(xiàn)自己的文件發(fā)生了變化。然后就可以放心的刪除dev分支了。

    $ git branch -d dev
    Deleted branch dev (was b17d20e).
    
    $ git branch
    * master
    

    這樣就會發(fā)現(xiàn)只剩下master分支。

解決沖突

  • 若我們先建立分支feature1.現(xiàn)在,master分支和feature1分支各自都分別有新的提交,變成了這樣:

    git-br-feature1

    這種情況下,Git無法執(zhí)行“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會有沖突.:

    $ git merge feature1
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    果然沖突了!Git告訴我們,readme.txt文件存在沖突,必須手動解決沖突后再提交。git status也可以告訴我們沖突的文件:

    $ git status
    On branch master
    Your branch is ahead of 'origin/master' by 2 commits.
      (use "git push" to publish your local commits)
    
    You have unmerged paths.
      (fix conflicts and run "git commit")
      (use "git merge --abort" to abort the merge)
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
    
        both modified:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    我們可以直接查看readme.txt的內(nèi)容:

    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.
    <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> feature1
    

    Git用<<<<<<<,=======>>>>>>>標(biāo)記出不同分支的內(nèi)容,我們修改如下后保存:

    Creating a new branch is quick and simple.
    

    再提交:

    $ git add readme.txt 
    $ git commit -m "conflict fixed"
    [master cf810e4] conflict fixed
    

    現(xiàn)在,master分支和feature1分支變成了下圖所示:

    git-br-conflict-merged

    用帶參數(shù)的git log也可以看到分支的合并情況:

    $ git log --graph --pretty=oneline --abbrev-commit
    *   cf810e4 (HEAD -> master) conflict fixed
    |\  
    | * 14096d0 (feature1) AND simple
    * | 5dc6824 & simple
    |/  
    * b17d20e branch test
    * d46f35e (origin/master) remove test.txt
    * b84166e add test.txt
    * 519219b git tracks changes
    * e43a48b understand how stage works
    * 1094adb append GPL
    * e475afc add distributed
    * eaadf4e wrote a readme file
    

    最后,刪除feature1分支:

    $ git branch -d feature1
    Deleted branch feature1 (was 14096d0).
    

    工作完成。

分支管理策略

也就是強制禁用Fast forward形式。

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

bug分支

Git還提供了一個stash功能,可以把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作:

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

現(xiàn)在,用git status查看工作區(qū),就是干凈的(除非有沒有被Git管理的文件),因此可以放心地創(chuàng)建分支來修復(fù)bug。

是時候接著回到dev分支干活了!

$ git checkout dev
Switched to branch 'dev'

$ git status
On branch dev
nothing to commit, working tree clean

工作區(qū)是干凈的,剛才的工作現(xiàn)場存到哪去了?用git stash list命令看看:

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

工作現(xiàn)場還在,Git把stash內(nèi)容存在某個地方了,但是需要恢復(fù)一下,有兩個辦法:

一是用git stash apply恢復(fù),但是恢復(fù)后,stash內(nèi)容并不刪除,你需要用git stash drop來刪除;

另一種方式是用git stash pop,恢復(fù)的同時把stash內(nèi)容也刪了:

$ git stash pop
On branch dev
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   hello.py

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   readme.txt

Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)

再用git stash list查看,就看不到任何stash內(nèi)容了:

$ git stash list

你可以多次stash,恢復(fù)的時候,先用git stash list查看,然后恢復(fù)指定的stash,用命令:

$ git stash apply stash@{0}

feature分支

feature分支與bug分支沒有本質(zhì)不同。

詳細參考廖雪峰官方微博

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容