zoukankan      html  css  js  c++  java
  • Git常用命令备忘

    基本操作

    • git init : 初始化

    • git add file : 添加

    • git commit -m "" : 提交

    • git status 查看哪些被修改,是否被提交

    • git diff filename : 查看修改了什么内容

    readme.txt

    Git is a version control system.
    Git is free software.
    

    修改后的readme.txt

    Git is a distributed version control system.
    Git is free software.
    
    • git status:

    1.刚刚编辑完成

    $ git status
    On branch master
    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
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    2.执行完add操作后:

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            modified:   readme.txt
    

    3.执行完commit

    $ git status
    On branch master
    nothing to commit, working tree clean
    
    • git diff:
    $ git diff readme.txt 
    diff --git a/readme.txt b/readme.txt
    index 46d49bf..9247db6 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,2 +1,2 @@
    -Git is a version control system.
    +Git is a distributed version control system.
     Git is free software.
    

    版本回退

    • git log [--pretty=oneline] 看到最近的修改和commit[一行显示简化结果]
    $ git log
    commit 7cc923c7c82f59baef45bad87a7fe92372141f31 (HEAD -> master)
    Author: wangchao <twilight@0402.com>
    Date:   Tue Aug 6 11:05:59 2019 +0800
    
        add GPL
    
    commit f620929dc0099452ccbfd74f24627492488018e9
    Author: wangchao <twilight@0402.com>
    Date:   Tue Aug 6 10:51:26 2019 +0800
    
        add distributed
    
    commit b09dc7d79bea6543be0491bd3779f561b25ec435
    Author: wangchao <twilight@0402.com>
    Date:   Tue Aug 6 10:50:17 2019 +0800
    
        wrote a readme file
    
    

    git中,HEAD 表示当前版本,HEAD^表示前一个版本,HEAD^^表示上上一个版本,上100各版本表示为HEAD~100,HEAD 其实是一个指针,回退版本其实就是移动指针。回退到上一个版本的命令是:

    • git reset --hard HEAD^ 回退到上一个版本

    此时 git log 已经不会展示之前的被抛弃的版本,如果上面的命令行没有关闭的话可以获得append GPLcommit id,此时用git reset 也可以还原:

    • git reset --hard 7cc923c7c82f59baef45b 还原到指定commit id指定的版本,id 不需要全写

    但是如果,命令行已经关闭,找不到commit id,此时使用 git reflog 命令可以查看:

    • git reflog 记录每一次命令
    $ git reflog
    f620929 (HEAD -> master) HEAD@{0}: reset: moving to head^
    7cc923c HEAD@{1}: reset: moving to 7cc923c7c82f59baef45bad87a7fe92372141f31
    f620929 (HEAD -> master) HEAD@{2}: reset: moving to HEAD
    f620929 (HEAD -> master) HEAD@{3}: reset: moving to HEAD^
    7cc923c HEAD@{4}: commit: add GPL								# 找到这行,前面就是 commit id
    f620929 (HEAD -> master) HEAD@{5}: commit: add distributed
    b09dc7d HEAD@{6}: commit (initial): wrote a readme file
    
    # 使用上面获得的id,就可以恢复到指定的版本
    $ git reset --hard 7cc923c
    HEAD is now at 7cc923c add GPL
    

    删除文件

    1.真的要删除 --> git rm filename --> git commit -m 'del file'
    2.误删,需要恢复文件 --> git checkout -- filename (用版本库的版本替换工作区的版本)

    # 删除文件
    $ rm test.txt
    
    # 查看状态
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            deleted:    test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    # 提交删除文件操作到暂存区
    git add test.txt  # 或者 git rm test.txt
    
    # 查看状态
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            deleted:    test.txt
    
    # 提交删除操作到版本库
    $ git commit -m 'del test.txt'
    [master 69c78ac] del test.txt
     1 file changed, 0 insertions(+), 0 deletions(-)
     delete mode 100644 test.txt
    
    

    撤销更改

    丢弃工作区的修改

    • git checkout -- readme.txt : 丢弃工作区的修改
    1. 还没有执行add,那么工作区将回到暂存区的状态
    2. 执行了add,还没有执行commit, 那么也将和暂存区一致
    • git reset HEAD <file> : 可以把暂存区的修改撤销掉(unstage),重新放回工作区
    总结如下: - 只修改了工作区,--> `git checkout -- ` - 提交到了暂存区,把暂存区和工作区同时撤销,--> `git reset HEAD ` --> `git checkout -- ` - 提交到了版本库,就只能回退版本,--> `git reset --hard HEAD^`

    远程仓库

    • ssh-keygen -t rsa -C "twilight0402@163.com" : 创建RSA密钥对
    • git remote add origin git@github.com:1601436878/AAA.git : 关联远程仓库
    • git remote rm origin : 解除与远程版本库的关联
    • git remote -v : 查看git对应的远程仓库地址
    • git push -u origin master : 第一次提交到远程
    • git push origin master : 之后提交不需要 -u
    • git clone git@github.com:1601436878/AAA.git : 克隆仓库,克隆后,保留了完整的git仓库,包括git log

    如果远程仓库有readme,回出错,第一次导入需要先pull

    • git pull --rebase origin master

    分支

    • git branch : 查看分支
    • git branch "name" : 创建分支
    • git checkout "name" : 切换分支
    • git checkout -b "name" : 创建+切换分支
    • git merge "name" : 合并某分支到当前分支
    • git branch -d "name" : 删除分支
    • 将远程分支拉取到本地(sourcetree中只需要双击远程分支即可):
      • git fetch origin 远程分支名:本地分支名 : 将远程分支拉取到本地
      • git checkout -b 本体分支 origin/远程分支: 拉取远程分支,并切换到新分支

    git branch dev创建dev分支,dev指向是指针,指向当前版本。master也是指针,指向master分支上的最新的位置,HEAD指向master或者dev

    git branch dev		# 从master分支的当前位置,创建dev分区
    git branch dev2		# 同理
    

    在不同的分支下修改文件,并分别提交

    git checkout dev
    vim README.md
    
    git checkout dev2
    vim README.md
    

    现在各个分支之间是这样的结构:
    git分支

    在不同的分支中,看不到其他分支的提交。但是git reflog可以看到所有分支的所有变化。没有被add或commit的变化在所有分支都是可见的。
    在master分支中执行 git merge dev 合并后,headmaster都指向了dev。这时可以删除dev了。
    git分支

    但是此时无法删除dev2.如果执行git branch -d dev2 会报错,此时可以用git branch -D dev2强行删掉dev2。如果想恢复到dev2的状态,就只能用 git reflog找到之前的 commit id了。

    冲突

    如果出现了一下这种情况,在合并分支时就会出现冲突

    git冲突

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

    冲突后readme.md文件变成了这样:

    $ cat README.md
    git is a distributed version control system.
    git is a free software under GPL.
    git has a mutable index called stage.
    
    <<<<<<< HEAD
    Creating a new branch is quick AND Simple.
    =======
    Creating a branch is quick & Simple.
    >>>>>>> dev
    

    此时需要手动修改readme.me文件,然后再 add 和 commit, 这样冲突才会解决

    $ cat README.md
    git is a distributed version control system.
    git is a free software under GPL.
    git has a mutable index called stage.
    
    Creating a new branch is quick and Simple.
    

    git log --graph 可以查看分支合并的情况

    $ git log --graph
    *   commit a40de601e061a393fae40df28796d9db4387bc27 (HEAD -> master)
    |  Merge: d6314aa 8dbf53c
    | | Author: wangchao <twilight@0402.com>
    | | Date:   Thu Aug 8 15:21:12 2019 +0800
    | |
    | |     fix confict
    | |
    | * commit 8dbf53c2d89e026544cc82be87ea21f593782ef8 (dev)
    | | Author: wangchao <twilight@0402.com>
    | | Date:   Thu Aug 8 15:07:13 2019 +0800
    | |
    | |     & Simple
    | |
    * | commit d6314aa206fcae0f103015933fe8027da2e763fb
    |/  Author: wangchao <twilight@0402.com>
    |   Date:   Thu Aug 8 15:04:19 2019 +0800
    |
    |       AND Simple
    |
    * commit 499304186d8522d0beb2ed328ead76631bf81a2f
    | Author: wangchao <twilight@0402.com>
    | Date:   Thu Aug 8 11:12:24 2019 +0800
    
    
    $ git log --graph --pretty=oneline --abbrev-commit
    *   a40de60 (HEAD -> master) fix confict
    |
    | * 8dbf53c (dev) & Simple
    * | d6314aa AND Simple
    |/
    * 4993041 edit in dev2
    * f8e17ea (origin/master) del readme.txt
    * 94571cf prepare
    * 2adf4b6 del test.txt
    * ee7d4b3 test.txt
    * 52cc68c understand how stage works
    * 16d5749 add GPL
    * ff98a79 add distributed
    * c435423 wrote a readme file
    * 1891025 Initial commit
    

    切换仓库

    // 先删除关联
    git remote rm origin
    // 再关联新的地址
    git remote add origin xxx
    

    .gitignore

    • 空行或是以#开头的行即注释行将被忽略;
    • 以斜杠 “/” 结尾表示目录;
    • 以星号 “*” 通配多个字符;
    • 以问号 “?” 通配单个字符
    • 以方括号 “[]” 包含单个字符的匹配列表;
    • 以叹号 “!” 表示不忽略(跟踪)匹配到的文件或目录;
    • 最前面加上/表示在当前目录下,不加则表示在所有目录下。比如data/,所有子目录下的data都会被忽略。

    git的.gitignore文件必须在项目push之前就创建。如果已经push过了再创建.gitignore就不会生效。
    但是!有解决办法!==> 清空本地缓存,再提交就可以生效 git rm -r --cached .。每次修改完.gitignore文件后也需要再次清理一次缓存。

    另,win下无法创建空文件名的文件,只能用gitBash的touch命令了

    小结

    • git status : 查看哪些被修改,是否被提交
    • git diff <filename> : 查看修改了什么内容,工作区和暂存区
    • git diff HEAD -- readme.txt : 查看工作区和版本库的区别
    • git log [--pretty=oneline] : 看到最近的commit记录 [一行显示简化结果]
    • git reflog : 记录每一次状态变化的命令,可以查看到每一次变化的 commit id

    从版本库恢复到工作区

    • git reset --hard HEAD^ : 回退到上一个版本
    • git reset --hard 7cc923c7c82f59baef45b : 还原到指定commit id指定的版本,id 不需要全写
    撤销工作区: - 只修改了工作区,--> `git checkout -- ` - 提交到了暂存区,把暂存区和工作区同时撤销,--> `git reset HEAD ` --> `git checkout -- ` - 提交到了版本库,就只能回退版本,--> `git reset --hard HEAD^`

    删除文件:
    1.真的要删除 --> git rm filename --> git commit -m 'del file'
    2.误删,需要恢复文件 --> git checkout -- filename (用版本库的版本替换工作区的版本)

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/twilight0402/p/13384348.html
Copyright © 2011-2022 走看看