• 【Git】常用命令


    【Git】常用命令

    转载:https://www.cnblogs.com/yangchongxing/p/10173994.html

    目录

    =======================================================

    1、配置

    2、查看配置

    3、获取帮助

    4、获取仓库

    5、检查状态

    6、状态简览

    7、跟踪新文件

    8、暂存已修改文件

    9、忽略文件

    10、查看未暂存的修改内容

    11、查看已暂存的修改内容

    12、Git Diff 的图像化插件版本

    13、提交更新

    14、提交更新(跳过使用暂存区域)

    15、删除文件

    16、移动文件

    17、查看提交历史Log

    18、撤消操作

    19、查看远程仓库

    20、添加远程仓库

    21、拉取远程仓库

    22、推送到远程仓库

    23、查看远程仓库

    24、重命名远程仓库

    25、移除远程仓库

    26、打标签

    27、Git 别名

    =======================================================

    生成公钥

    $ ssh-keygen -t rsa -C "EmailAddress@126.com"

    /用户/.ssh/id_rsa.pub 中生成了公钥

    1、配置

    $ git config --global user.name "杨崇兴"
    $ git config --global user.email yangchongxing@admin.com

    2、查看配置

    2.1、全部key

    $ git config --list

    2.2、单个key

    $ git config user.name

    3、获取帮助

    $ git help <verb>
    $ git <verb> --help
    $ man git-<verb>

    例子

    $ git help config

    4、获取仓库

    4.1、在现有目录中初始化仓库

    $ git init

    如果你是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,你应该开始跟踪这些文件并提交。 你可通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交:

    $ git add *.java
    $ git add LICENSE
    $ git commit -m 'initial project version'

    4.2、克隆现有的仓库

    克隆仓库的命令格式是 git clone [url]

    $ git clone https://github.com/libgit2/libgit2

    这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

    如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:

    $ git clone https://github.com/libgit2/libgit2 mylibgit

    这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。

    Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git 。

    5、检查状态

    $ git status

    6、状态简览

    $ git status -s

    7、跟踪新文件

    $ git add README

    查看状态显示:Changes to be committed:(要提交的修改)

    8、暂存已修改文件

    已追踪文件修改后查看状态:Changes not staged for commit:(要暂存的修改)
    这行下面的命令暂存

    $ git add LICENSE

    9、忽略文件

    创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

    文件 .gitignore 的格式规范如下:
      所有空行或者以 # 开头的行都会被 Git 忽略。
      可以使用标准的 glob 模式匹配。
      匹配模式可以以(/)开头防止递归。
      匹配模式可以以(/)结尾指定目录。
      要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

    所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(*) 表示匹配任意中间目录,比如`a/**/z` 可以匹配 a/z, a/b/z 或 `a/b/c/z`等。

    下面是一个 .gitignore 文件示例

    # 忽略.txt结尾的文件
    *.txt
    
    # 忽略build目录
    build/
    
    # 仅仅忽略当前目录的TODO文件,不是子目录subdir/TODO文件,不递归
    /TODO
    
    # 忽略当前目录doc/notes.txt文件, 而不是doc/server/arch.txt文件,不递归
    doc/*.txt
    
    # 忽略doc/目录下所有.pdf文件
    doc/**/*.pdf

     10、查看未暂存的修改内容

    $ git diff

    此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。

    请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。

    例子

    diff --git a/README b/README
    index 50bba42..79f5c7f 100644
    --- a/README
    +++ b/README
    @@ -1,4 +1,4 @@
     readme
     L1
    -L2
     L3
    +hello

    11、查看已暂存的修改内容

    若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。)

    $ git diff --cached
    $ git diff --staged

    例子

    diff --git a/LICENSE b/LICENSE
    deleted file mode 100644
    index ea5ef99..0000000
    --- a/LICENSE
    +++ /dev/null
    @@ -1,3 +0,0 @@
    -LICENSE lll
    -123
    -456

    10和11文件的状态

    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            deleted:    LICENSE
    
    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

    12、Git Diff 的图像化插件版本

    在本书中,我们使用 git diff 来分析文件差异。 但是,如果你喜欢通过图形化的方式或其它格式输出方式的话,可以使用 git difftool 命令来用 Araxis ,emerge 或 vimdiff 等软件输出 diff 分析结果。 使用 git difftool --tool-help 命令来看你的系统支持哪些 Git Diff 插件。

    $ git difftool

     13、提交更新

    确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。 这些修改过的文件只保留在本地磁盘。 所以,每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令。

    $ git commit

    这种方式会启动文本编辑器以便输入本次提交的说明。

    另外,你也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行。--amend选项会提交到最后一次提交中,也可修改最后一次提交的注释

    $ git commit -m "add file"
    $ git commit --amend -m 'add file'
    [master 6c8ddd8] test commit
     1 file changed, 3 deletions(-)
     delete mode 100644 LICENSE

     14、提交更新(跳过使用暂存区域)

    只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

    $ git commit -a -m 'added'

    这样就不用git add,注意:仅对已经跟踪过的文件才可以

     15、删除文件

    要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。

    可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

    注意:必须是已跟踪已提交未修改的文件,没有追踪的文件直接使用 rm 命令删除即可

    $ git rm README

    如果删除之前修改过并且已经放到暂存区域(git add)的话,则必须要用强制删除选项 -f也就是说修改过

    注意:必须是已跟踪已修改的文件,有没有暂存修改都可以删除

    $ git rm -f README

    另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 

    注意:删除后文件将变为Untracked files(未跟踪),若不想被 git 跟踪可以加入 .gitignore 文件。

    $ git rm --cached a.txt

    其他一些例子

    git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。 比方说:

    $ git rm log/*.log

    注意到星号 * 之前的反斜杠 , 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件。 类似的比如:

    $ git rm *~

    该命令为删除以 ~ 结尾的所有文件。

     16、移动文件

    $ git mv file_from file_to
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            renamed:    file_from -> file_to

    其实,运行 git mv 就相当于运行了下面三条命令:

    $ mv README.md README
    $ git rm README.md
    $ git add README

    如此分开操作,Git 也会意识到这是一次改名,所以不管何种方式结果都一样。 两者唯一的区别是,mv 是一条命令而另一种方式需要三条命令,直接用 git mv 轻便得多。

    17、查看提交历史Log

    无参按提交时间列出

    $ git log

    出现多页时,按回车显示下一行,按空格显示下一页,按q退出。

    SHA-1 校验
    作者的名字和电子邮件地址
    提交时间以
    提交说明

    commit 4d51d32aca59e1d4ffeeccb73037542128eb84a1 (HEAD -> master)
    Author: win <win@126.com>
    Date:   Wed Dec 26 15:36:49 2018 +0800
    
        添加编辑功能

    参数 -p:显示每次提交的内容差异

    参数 -n:显示最近n(数字)提交

    $ git log -p -2
    commit 46fa22b5346bfc121a543be5230e8c2738104267 (HEAD -> master)
    Author: win <win@126.com>
    Date:   Thu Dec 27 11:37:09 2018 +0800
    
        追加service.java
    
    diff --git a/readme b/readme
    index e70eb97..d2d6456 100644
    --- a/readme
    +++ b/readme
    @@ -1,3 +1,4 @@
     learn git
     this is a readme file, record information of project.
     追加index.java
    +追加service.java
    
    commit bae33eedc50815f68036db2a48f62a6d349fc7ad
    Author: win <win@126.com>
    Date:   Thu Dec 27 11:36:14 2018 +0800
    
        追加index.java
    
    diff --git a/readme b/readme
    index 28fdfe1..e70eb97 100644
    --- a/readme
    +++ b/readme
    @@ -1,2 +1,3 @@
     learn git
     this is a readme file, record information of project.
    +追加index.java

     参数 --stat:查看提交的简略的统计信息

    $ git log -2 --stat
    commit 46fa22b5346bfc121a543be5230e8c2738104267 (HEAD -> master)
    Author: win <win@126.com>
    Date:   Thu Dec 27 11:37:09 2018 +0800
    
        追加service.java
    
     readme | 1 +
     1 file changed, 1 insertion(+)
    
    commit bae33eedc50815f68036db2a48f62a6d349fc7ad
    Author: win <win@126.com>
    Date:   Thu Dec 27 11:36:14 2018 +0800
    
        追加index.java
    
     readme | 1 +
     1 file changed, 1 insertion(+)

    列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了

    参数 --pretty:指定使用不同于默认格式的方式展示提交历史

    每个提交放在一行显示

    $ git log --pretty=oneline

    还有下面三个

    $ git log --pretty=short
    $ git log --pretty=full
    $ git log --pretty=fuller

    定制要显示的记录格式

    $ git log --pretty=format:"%h - %an, %ar : %s"
    选项   说明
    %H    提交对象(commit)的完整哈希字串
    %h    提交对象的简短哈希字串
    %T    树对象(tree)的完整哈希字串
    %t    树对象的简短哈希字串
    %P    父对象(parent)的完整哈希字串
    %p    父对象的简短哈希字串
    %an   作者(author)的名字
    %ae   作者的电子邮件地址
    %ad   作者修订日期(可以用 --date= 选项定制格式)
    %ar   作者修订日期,按多久以前的方式显示
    %cn   提交者(committer)的名字
    %ce   提交者的电子邮件地址
    %cd   提交日期
    %cr   提交日期,按多久以前的方式显示
    %s    提交说明

    你一定奇怪 作者 和 提交者 之间究竟有何差别, 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。

    当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用

    $ git log --pretty=format:"%h %s" --graph

    git log 的常用选项 列出了我们目前涉及到的和没涉及到的选项

    选项              说明
    -p               按补丁格式显示每个更新之间的差异。
    --stat           显示每次更新的文件修改统计信息。
    --shortstat      只显示 --stat 中最后的行数修改添加移除统计。
    --name-only      仅在提交信息后显示已修改的文件清单。
    --name-status    显示新增、修改、删除的文件清单。
    --abbrev-commit  仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
    --relative-date  使用较短的相对时间显示(比如,“2 weeks ago”)。
    --graph          显示 ASCII 图形表示的分支合并历史。
    --pretty         使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

    限制输出长度

    $ git log --since=2018-12-26
    $ git log --since=2.weeks

    另一个非常有用的筛选选项是 -S,可以列出那些添加或移除了某些字符串的提交。 比如说,你想找出添加或移除了某一个特定函数的引用的提交,你可以这样使用:

    $ git log -Sfunction_name
    选项                说明
    -(n)               仅显示最近的 n 条提交
    --since, --after   仅显示指定时间之后的提交。
    --until, --before  仅显示指定时间之前的提交。
    --author           仅显示指定作者相关的提交。
    --committer        仅显示指定提交者相关的提交。
    --grep             仅显示含指定关键字的提交
    -S                 仅显示添加或移除了某个关键字的提交

    18、撤消操作

    (1).修改提交信息,补漏提交文件

    有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:

    $ git commit --amend -m '修改注释'

    这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改,那么快照会保持不变,而你所修改的只是提交信息。

    文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。

    例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend

    最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。

    (2).文件已暂存的,取消暂存,保留修改内容,变为未暂存

    $ git reset HEAD filename.txt

    执行完毕,文件变为修改未暂存的状态

    (3).文件未暂存的,撤消对文件的修改,丢弃修改内容

    $ git checkout -- filename.txt

    你需要知道是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。

     19、查看远程仓库

    $ git remote -v

    必须在git目录下使用,若没有可以克隆一份

    $ git clone https://github.com/schacon/ticgit

    20、添加远程仓库

    $ git remote add <shortname> <url>

    shortname 简写,url 仓库地址

    $ git remote add pb https://github.com/paulboone/ticgit
    $ git remote -v

    现在你可以在命令行中使用字符串 pb 来代替整个 URL。例如,如果你想拉取 Paul 的仓库中有但你没有的信息,可以运行 git fetch pb:

    $ git fetch pb
    remote: Counting objects: 43, done.
    remote: Compressing objects: 100% (36/36), done.
    remote: Total 43 (delta 10), reused 31 (delta 5)
    Unpacking objects: 100% (43/43), done.
    From https://github.com/paulboone/ticgit
     * [new branch]      master     -> pb/master
     * [new branch]      ticgit     -> pb/ticgit

    现在 Paul 的 master 分支可以在本地通过 pb/master 访问到 - 你可以将它合并到自己的某个分支中,或者如果你想要查看它的话,可以检出一个指向该点的本地分支。 

     21、拉取远程仓库

    $ git fetch [remote-name]

    这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

    如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。

    如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

    22、推送到远程仓库

    $ git push [remote-name] [branch-name]

    当你想要将 master 分支推送到 origin 服务器时,那么运行这个命令就可以将你所做的备份到服务器:

    $ git push origin master

    只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。

    $ git push -u origin master

    参数:-u,指定一个默认主机,这样后面就可以不加任何参数使用 git push 命令

    23、查看远程仓库

    $ git remote show [remote-name]

    查看远程origin

    $ git remote show origin

    24、重命名远程仓库

    想要将 pb 重命名为 paul

    $ git remote rename pb paul

    值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。

    25、移除远程仓库

    $ git remote rm paul

    26、打标签

    (1).列出标签

    $ git tag

    (2).创建附注标签

    在 Git 中创建一个附注标签是很简单的。 最简单的方式是当你在运行 tag 命令时指定 -a 选项:

    $ git tag -a v1.0 -m '版本1.0'

    -m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。

    通过使用 git show 命令可以看到标签信息与对应的提交信息:

    $ git show v1.0

    输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。

    (3).创建轻量标签

    创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字

    $ git tag v2.0
    $ git show v2.0

    (4).后期打标签

    $ git tag -a v1.2 校验和

    (5).共享标签

    默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样 - 你可以运行 git push origin [tagname]。

    $ git push origin v1.5

    (6).检出标签

    在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。 如果你想要工作目录与仓库中特定的标签版本完全一样,可以使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个新分支:

    $ git checkout -b version2 v2.0.0

    当然,如果在这之后又进行了一次提交,version2 分支会因为改动向前移动了,那么 version2 分支就会和 v2.0.0 标签稍微有些不同,这时就应该当心了。

    27、Git 别名

    如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名

    这里有一些例子

    $ git config --global alias.co checkout
    $ git config --global alias.br branch
    $ git config --global alias.ci commit
    $ git config --global alias.st status
    $ git config --global alias.unstage 'reset HEAD --'
    $ git unstage fileA
    $ git reset HEAD -- fileA
    $ git config --global alias.last 'log -1 HEAD'
    $ git last
  • 相关阅读:
    UOJ309 UNR #2 排兵布阵
    BZOJ4860: [Beijing2017]树的难题
    CQOI2017 部分题解
    SDOI2017 Round1 Day2 题解
    记SCOI2017
    BZOJ3810: [Coci2015]Stanovi
    BZOJ4785: [Zjoi2017]树状数组
    「ZJOI2007」「LuoguP1169」棋盘制作(并查集
    「LuoguP4147」 玉蟾宫(并查集
    「LuoguP1402」 酒店之王(最大流
  • 原文地址:https://www.cnblogs.com/yangchongxing/p/10173994.html
Copyright © 2020-2023  润新知