1. $git init
使用 Git 来对现有的项目进行管理
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,只是做了一个初始化的操作,项目里的文件还没有被跟踪。
2. $git clone [url]
克隆一个库
e.g1:$git clone https://github.com/libgit2/libgit2
这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。
e.g2:$git clone https://github.com/libgit2/libgit2 mylibgit
这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。
e.g3:$git clone -o booyah
默认的远程分支名字将会是 booyah/master
3. $git status / $git status -s / $git status --short
检查当前文件状态
在 Changes to be committed 这行下面的,就说明是已暂存状态。
在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。
文件可能同时出现在暂存区和非暂存区,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来,要不然提交运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来。
4. 1)$git diff(只显示已经被追踪的文件)
查看已暂存和未暂存的文件更新了哪些部分,此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。
2)$git diff --cached / $git diff --staged
查看已暂存的将要添加到下次提交里的内容
5. 1)$git commit
这种方式会启动文本编辑器以便输入本次提交的说明。默认的提交消息包含最后一次运行 git status 的输出,放在注释行里,另外开头还有一空行,供你输入提交说明。 你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。 退出编辑器时,Git 会丢掉注释行,用你输入提交附带信息生成一次提交。
2)$git commit -v
这会将你所做的改变的 diff 输出放到编辑器中从而使你知道本次提交具体做了哪些修改。) 退出编辑器时,Git 会丢掉注释行,用你输入提交附带信息生成一次提交。
提交时记录的是放在暂存区域的快照。 任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。 每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
3)$git commit -a
e.g:$git commit -a -m 'add new benchmarks'
跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
4)$git commit --amend
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。
e.g: 如下最终你只会有一个提交,第二次提交将代替第一次提交的结果。
$git commit -m "initial commit"
$git add forgotten_file
$git commit --amend
6. 1)$git rm PROJECTS.md / git rm -f PROJECTS.md
从已跟踪文件清单中移除(确切地说,是从暂存区域移除)某个文件,记录此次移除文件的操作(该操作会将本地文件也一并删除)
2)$git rm --cached REAd
我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中使用此命令。
3)$git rm log/\*.log
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件。
4)$git rm \*~
删除以 ~ 结尾的所有文件。
7. $git mv README.md README
等价于
$mv README.md README
$git rm README.md
$git add README
8. 1)$git log
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。
这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
2)$git log -p -2
一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交
3)$git log --stat
--stat 选项在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。
4) $git log --pretty=format
format:"占位符含义如下所示"
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
5)$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(后跟指定格式)。
6) 限制$git log输出长度的选项(即筛选选项,可结合使用)
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
--grep 仅显示含指定关键字的提交
-S 仅显示添加或移除了某个关键字的提交
--文件名或路径名 仅显示某些文件或者目录的历史提交
7)e.g:git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t
查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试文件
8)git log --oneline --decorate
查看各个分支当前所指的对象(commit对象)
9. $git reset HEAD 文件名
取消暂存,使文件从暂存状态变成修改未暂存的状态了,有点类似$git rm --cached REAd
10. $git checkout -- 文件名
撤消修改 - 将它还原成上次提交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)
PS:一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。
11. 1)$git remote
它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin - 这是 Git 给你克隆的仓库服务器的默认名字
2)$git remote -v
指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
3)$git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写
4) $git remote show [remote-name]
查看某一个远程仓库的更多信息
会列出远程仓库的 URL 与跟踪分支的信息。 这些信息非常有用,它告诉你正处于 master 分支,并且如果运行 git pull,就会抓取所有的远程引用,然后将远程 master 分支合并到本地 master 分支。 它也会列出拉取到的所有远程引用。
12. $git fetch [remote-name]
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
该命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
1)如果远程有本地没有的数据(远程比本地数据要新),则更新本地数据库,移动分支指针指向新的、更新后的位置。
2)如果远程是本地的一个子集(远程比本地数据要旧), Git 并不会抓取数据而是会设置远程跟踪分支 [remoteName]/[branchName] 指向 [remoteName] 的 [branchName] 分支
13. $git pull
如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支.默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。
运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
14. $git push [remote-name] [branch-name]
e.g: $git push origin master
推送到远程仓库,当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。
你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
$git push [remote-name] [localBranchName]:[remoteBranchName]
推送本地分支到一个命名不相同的远程分支
15. $git remote rename [old-remote-name] [new-remote-name]
将远程仓库的名字从old-remote-name改为new-remote-name
16. $git remote rm [remote-name]
移除一个远程仓库
17. 1)$git tag
这个命令以字母顺序列出标签;但是它们出现的顺序并不重要。
2)$git tag -l "[tagName]"
使用特定的模式查找标签
e.g:$ git tag -l 'v1.8.5*'
18. 1)$git tag -a [tagNme] -m "[tagInformation]"
创建一个附注标签
附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。
2)$git tag [tagName]
创建一个轻量标签
创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字
3)$git tag -a [tagName] [sha]
对过去(sha对应着每个过去)的提交打标签
19. 1)$git show [tagName]
附注标签:输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。
轻量标签:不会看到额外的标签信息。 命令只会显示出提交信息
20. 1) $git push origin [tagName]
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样
现在,当其他人从仓库中克隆或拉取,他们也能得到你的那些标签。
2) $git push origin --tags
如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。
现在,当其他人从仓库中克隆或拉取,他们也能得到你的那些标签。
3) $git push [remote-name] :refs/tags/[tagName]
删除本地标签之后使用 git push <remote> :refs/tags/<tagname> 来更新你的远程仓库
4) $git push [remoteName] --delete [remoteBranchName]
从服务器上删除 serverfix 分支
这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的。
21. $git tag -d [tagName]
删除掉一个轻量级标签
22. $git checkout [tagName]
检出标签
23. 1)$git branch [branchName]
创建分支(Git 的分支,其实本质上仅仅是指向提交对象的可变指针。)
该命令会在当前所在的提交对象上创建一个指针。(即分支)
HEAD是一个指针,指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。
2)$git branch -d [branchName]
删除分支branchName
3)$git branch
不加任何参数运行它,会得到当前所有分支的一个列表,* 字符代表现在检出的那一个分支(也就是说,当前 HEAD 指针所指向的分支)
4)$git branch -v
查看每一个分支的最后一次提交
5) $git branch -vv
查看设置的所有跟踪分支,会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
6) $git branch --merged
查看哪些分支已经合并到当前分支
在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
7) $git branch --no-merged
查看哪些分支未合并到当前分支,尝试使用 git branch -d 命令删除它时会失败
24. 1)$git checkout [branchName]
切换分支(改变头指针指向的位置)(HEAD 分支随着提交操作自动向前移动)
2)$git checkout -b [branchName]
新建并且切换到新建的分支
该命令等价于切换到
git branch [branchName]
git checkout [branchName]
3)$git checkout -b [localBranchName] [remoteName/branchName]
remoteName/branchName = 远程跟踪分支的引用
要特别注意的一点是当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换一句话说,这种情况下,不会有一个新的 serverfix 分支 - 只有一个不可以修改的 origin/serverfix 指针。
有两种方式创建本地分支:
a. 用这个命令给你一个用于工作的本地分支,并且起点位于 origin/serverfix。
b. 运行 git merge origin/serverfix 将这些工作合并到当前所在的分支。
如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
4)$git checkout --track [remoteName/remoteBranch],等价于指令3
5)$git checkout -b [localBranchName] [remoteName/branchName]
将本地分支与远程分支设置为不同名字,你可以轻松地使用上一个命令增加一个不同名字的本地分支
6)$git branch -u/--set-upstream-to [remoteName/branchName]
修改正在跟踪的上游分支,你可以在任意时间使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置。
需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。 这个命令并没有连接服务器,它只会告诉你关于本地缓存的服务器数据。 如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。 可以像这样做:$ git fetch --all; git branch -vv
25. $git merge [branchName]
情况一:如果顺着当前分支走下去额能够到达另一个分支,那么Git在合并两者的时候,只会简单的将指针向前推进(指针右移),因为在这种情况下的合并操作并没有需要解决的分歧---这就叫做“快进(fast-forward)”,不会产生新的Commit点
情况二:如果开发历史从一个更早的地方开始分叉开来,出现这种情况,Git会使用两个分支的末端所指的快照以及这两个分支的工作祖先,做一个简单的三方合并,会产生新的Commit点
对于情况二,如果要合并的这两个分支对同一个文件的同一个地方做了修改(git认为的同一个文件的同一个地方),那么 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件
在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。输入 git commit 来完成合并提交。
26. $git ls-remote [remoteName]
显式地获得远程引用(对远程仓库的引用(指针),包括分支、标签等等)的完整列表
27. $git remote show [remoteName]
获得远程分支的更多信息
远程分支状态的引用是你不能移动的本地引用,当你做任何网络通信操作时,它们会自动移动。 远程跟踪分支像是你上次连接到远程仓库时,那些分支所处状态的书签。