【Git】常用命令
转载:https://www.cnblogs.com/yangchongxing/p/10173994.html
目录
=======================================================
=======================================================
生成公钥
$ ssh-keygen -t rsa -C "EmailAddress@126.com"
/用户/.ssh/id_rsa.pub 中生成了公钥
$ git config --global user.name "杨崇兴" $ git config --global user.email yangchongxing@admin.com
2.1、全部key
$ git config --list
2.2、单个key
$ git config user.name
$ git help <verb> $ git <verb> --help $ man git-<verb>
例子
$ git help config
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 。
$ git status
$ git status -s
$ git add README
查看状态显示:Changes to be committed:(要提交的修改)
已追踪文件修改后查看状态:Changes not staged for commit:(要暂存的修改)
这行下面的命令暂存
$ git add LICENSE
创建一个名为 .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
$ 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
若要查看已暂存的将要添加到下次提交里的内容,可以用 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
在本书中,我们使用 git diff 来分析文件差异。 但是,如果你喜欢通过图形化的方式或其它格式输出方式的话,可以使用 git difftool 命令来用 Araxis ,emerge 或 vimdiff 等软件输出 diff 分析结果。 使用 git difftool --tool-help 命令来看你的系统支持哪些 Git Diff 插件。
$ git difftool
确认还有什么修改过的或新建的文件还没有 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
只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
$ git commit -a -m 'added'
这样就不用git add,注意:仅对已经跟踪过的文件才可以
要从 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 *~
该命令为删除以 ~ 结尾的所有文件。
$ 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 轻便得多。
无参按提交时间列出
$ 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 仅显示添加或移除了某个关键字的提交
(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
你需要知道是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。
$ git remote -v
必须在git目录下使用,若没有可以克隆一份
$ git clone https://github.com/schacon/ticgit
$ 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 访问到 - 你可以将它合并到自己的某个分支中,或者如果你想要查看它的话,可以检出一个指向该点的本地分支。
$ git fetch [remote-name]
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
$ git push [remote-name] [branch-name]
当你想要将 master 分支推送到 origin 服务器时,那么运行这个命令就可以将你所做的备份到服务器:
$ git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
$ git push -u origin master
参数:-u,指定一个默认主机,这样后面就可以不加任何参数使用 git push 命令
$ git remote show [remote-name]
查看远程origin
$ git remote show origin
想要将 pb 重命名为 paul
$ git remote rename pb paul
值得注意的是这同样也会修改你的远程分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。
$ git remote rm paul
(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 标签稍微有些不同,这时就应该当心了。
如果不想每次都输入完整的 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