美文网首页
git常用命令

git常用命令

作者: Lacy_Tian | 来源:发表于2019-02-05 00:34 被阅读0次

    git常用命令

    这篇文章将来介绍一下git常用命令。

    创建版本库

    • 在c盘创建一个目录,例如 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来表示当前版本,用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 可以用来查看状态。

    撤销修改

    • git checkout -- file可以丢弃工作区的修改。例如:

      $ git checkout -- readme.txt
      

      用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

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

    删除文件

    • 若创建了一个文件并提交了上去。例如:创建了一个新文件test.txt 到git并提交了。

      这样可以执行

    $ 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
    
    这样文件就从版本库里删除了。
    

    另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

    $ git checkout -- test.txt
    

    GitHub上创建自己的远程仓库

    • 首先配置好自己的GitHub网站然后输入命令,使自己的本地仓库可以上传到远程仓库中。
    $ git remote add origin git@github.com:michaelliao/learngit.git
    

    ​ 其中michaelliaoGitHub用户名。

    ​ 下一步,就可以把本地库的所有内容推送到远程库上:

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

    从现在起,只要本地作了提交,就可以通过命令:

    $ git push origin master
    

    把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

    远程库克隆

    • 假设你有一个新的仓库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.
      

    创建分支

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

      相当于

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

      git branch命令查看当前分支:

      $ 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'
      

      然后你就会发现原来的修改不见了。现在,我们把dev分支的工作成果合并到master分支上:

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

      这样就会发现自己的文件发生了变化。然后就可以放心的删除dev分支了。

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

      这样就会发现只剩下master分支。

    解决冲突

    • 若我们先建立分支feature1.现在,master分支和feature1分支各自都分别有新的提交,变成了这样:

      git-br-feature1

      这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突.:

      $ 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的内容:

      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用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

      Creating a new branch is quick and simple.
      

      再提交:

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

      现在,master分支和feature1分支变成了下图所示:

      git-br-conflict-merged

      用带参数的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功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

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

    现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

    是时候接着回到dev分支干活了!

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

    工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

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

    工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

    另一种方式是用git stash pop,恢复的同时把stash内容也删了:

    $ 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内容了:

    $ git stash list
    

    你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

    $ git stash apply stash@{0}
    

    feature分支

    feature分支与bug分支没有本质不同。

    详细参考廖雪峰官方微博

    相关文章

      网友评论

          本文标题:git常用命令

          本文链接:https://www.haomeiwen.com/subject/kydcsqtx.html