Git常用命令
Git 常用命令速查表(三)
git clone 收取项目历史的所有数据(每一个文件的每一个版本),凡是服务器上有的数据,克隆之后本地也都有了。
其中包含一个.git
的目录,用于保存下载下来的所有版本记录。然后从中取出项目最新版本的所有文件拷贝放在与
.git并列的文件夹下
。
git init 对现有的某个项目开始用Git管理
表示在当前目录(文件夹)下创建了一个.git的隐藏目录,这个就是所谓的Git本地仓库,所有 Git 需要的数据和资源都存放在这个目录中。git初始化之后,当前文件夹称之为work tree(工作树)。
将工作树中增加或修改的一些文档生成快照存至Git本地仓库的一个暂存区stage中(
git add . 将当前目录下的所有文件纳入版本控制
称该区域为索引index
),并且变成Git本地仓库能够识别的数据格式。add 与后面的”.”是有一个空格的,这个”.”表示所有的文档。如果只生成一个文档,则将”.”改为“相对路径/文档名”即可。
git add examples/ex_ssdata.cpp
新增加的文件是“Untracked files”,处于未跟踪状态;未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件。
Git 不会自动将之纳入跟踪范围,除非你使用“git add”明明白白地告诉它“我需要跟踪该文件”。
git status 检查当前文件状态
工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新(unmodified),已修改(modified)或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。
一般有以下几种状态:
Untracked files:新创建的文件,还没有执行git add
Changes not staged for commit:已跟踪的(或者曾经git add过的)文件修改之后,还没有执行git add进行暂存
Changes to be committed:已经执行过git add,已暂存,下次将要被一起提交的文件
git diff 查看修改之后还没有暂存起来的文件和暂存区域快照之间的差异
git diff --cached 查看已经暂存起来的文件和上次提交时的快照之间的差异
git log #可以查看每次commit的改变
git diff #可以查看最近一次改变的內容,加上参数可以看其它的改变并互相比较
git show #可以看某次的变更
git commit 将暂存区域的文件一起提交,完成纳入操作git add操作相当于把纸放入打印机;git commit相当于纸放进去之后要把门推进去合上,这样打印机才能工作!
每次准备提交前,都必须先用git status看看哪些
修改过的或新建的文件还没有git add
过,否则提交的时候不会记录这些还没暂存起来的变化!!
git commit -m "版本更新信息说明"
# 也可以将git add与git commit用一个指令完成
# git commit
加上-a
选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤。
git commit -a -m "msg"
git commit -am "add ex_ssdata.cpp"
将快照/索引中的内容提交到Git本地版本库中。Git的每次更新都需要提交一次。
.gitignore 文档忽略
在本地Git仓库的根目录创建一个名为.gitignore
的文件,将工作树中你不希望接受Git管理的文档的文件模式写到.gitignore 文件中。
通常都是些IDE配置文件或者自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。
vim .gitignore# Atom
.clang_complete
.atom*.json
.atom*.cson
.clang_complete
.atom*.json
.atom*.cson
git rm 从工作目录中删除指定的文件,同时从已跟踪文件清单中移除(确切地说,是从暂存区域移除)。
删除之后,必须执行
git commit
,将删除该文件的操作提交上去。单纯用ubuntu命令
rm
来删除文件的话,仅仅是删除了物理文件,并没有将其从 git 的记录中剔除。对于用
rm
命令直接删除的文件,也可以再通过 git rm
命令重新将该文件从 git 的记录中删除掉,不能通过git add剔除。因为git add .
仅能记录添加、改动的动作,删除的动作需靠 git rm
来完成。- 即通过:rm + git rm + git commit -m "abc"的方式记录删除动作!
- 还可以通过:rm + git commit -am "abc"的方式记录删除动作!
git rm --cached 把文件从Git仓库中删除(亦即从暂存区域移除),但仍然保留在当前工作目录中。移除跟踪但不删除文件。
比如一些大型日志文件或者一堆.a
编译文件以及编译配置文件等,这些文件是必要的,所以要移除跟踪但不删除文件。
移除之后,一定要在.gitignore
文件中补上这些文件条目。
git rm log/\*.log
git rm \*~
加反斜杠\表示递归删除指定目录及其子目录中所有匹配的文件
git checkout -- test.txt 把误删的文件test.txt用版本库里的文件恢复到最新版本
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
git mv file_from file_to 在Git中重命名某个文件
仓库中存储的元数据并不会体现出这是一次改名操作,即不需要通过git add来进行暂存!
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(后跟指定格式)。
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
撤销操作:
git commit --amend
修改最后一次提交
git reset HEAD benchmarks.rb
取消已经暂存的文件
git checkout -- benchmarks.rb
取消对文件的修改
这条命令有些危险,所有对文件的修改都没有了,因为该操作是把之前版本的文件复制过来重写了此文件。
远程仓库操作:
git remote 查看当前配置有哪些远程仓库
git remote add origin git@github.com:fuleying/git-download.git 为远程仓库增加一个别名
git remote -v --verbose
的简写,显示远程仓库对应的克隆地址
git remote show [remote-name]
查看某个远程仓库的详细信息
git remote rename
from to 命令修改某个远程仓库在本地的简称git remote rm
[remote-name] 移除远端仓库的别名
分支:分支全部都是本地分支。当你在使用分支及合并的时候,一切都是在你自己的Git仓库中进行的,完全不涉及与服务器的交互。
1.新建分支(名为local),仅仅是建立了一个新的分支,但不会自动切换到这个分支中去。
git branch local 从当前分支(默认HEAD处)分化出一个新的分支
git checkout -b local
从当前分支(默认HEAD处)分化出一个新的分支并切换到该分支
git branch local [远程名/分支名] 从指定分支处分化出一个新的分支
git checkout -b local [
远程名/分支名
]
从指定分支处分化出一个新的分支
并切换到该分支
2.查看存在多少分支[-a也显示远程仓库分支]
$ git branch [-a]
local
* master *
字符表示当前所在的分支
查看远程分支remote,用
git branch -r(远程仓库名)/(分支名)
的形式表示远程分支。
远程分支(remote branch)是对远程仓库中的分支的索引。一次Git clone,会自动为你将此远程仓库命名为origin
,并下载其中所有的数据,建立一个指向它的master
分支的指针,在本地命名为origin/master
,但你无法在本地更改其数据。
接着,Git建立一个属于你自己的本地master
分支,始于origin
上master
分支相同的位置,你可以就此开始工作。可以运行
git fetch origin
来同步远程服务器上的数据到本地。该命令首先找到origin
是哪个服务器,然后从上面获取你尚未拥有的数据,更新你本地的数据库,然后把origin/master
的指针移到它最新的位置上。
git branch -v 查看各个分支最后一个提交对象的信息verbosegit branch --merge
查看哪些分支已被并入当前分支。
列表中没有*
的分支通常都可以用git branch -d
来删掉,因为已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。
git branch --no-merged
查看尚未合并的分支
3.切换到分支/主文件夹
$ git checkout local
4.分支的合并
$ git checkout master # 将当前分支切换为master $ git merge local # 将local分支合并到当前分支master上
第一种合并情况:如果顺着一个分支走下去可以到达另一个分支的话,那么Git在合并两者时,只会简单地把指针右移,称为快进(Fast forward)。
第二种合并情况:
如果是两个分叉的分支进行合并,Git会用两个分支的末端(C4和C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算。Git没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)(见图 3-17)。这个提交对象比较特殊,它有两个祖先(C4 和 C5)。
第三种合并情况:
如果在不同的分支中都修改了同一个文件的同一部分,Git就无法干净地把两者合到一起。Git作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用git status
查阅。任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。
5.分支衍合:把在一个分支里提交的改变移到另一个分支里重放一遍。
$ git rebase
虽然会跟merge合并操作得到的结果没有任何区别,但衍合能产生一个更为整洁的提交历史,仿佛所有修改都是在一根线上先后进行的。
6.删除分支,一般是合并之后将重复的分支删除
$ git branch -d local
git pull:从远端仓库取回版本更新
-
pull指令其实包含了fetch(將变更复制回來)以及merge(合并)操作两个步骤!
- git push:可将本地版本更新推送到远端仓库中。
# 将github(远程)的git档案与本地的同步(即更新本地端的repo)
push命令只能将代码push到你自己的分支上。
push 提交(这里提交的方式是使用http的方式,也有ssh的提交方法,这里面就不做介绍了)
git remote add origin https://github.com/username/Hello-World.git
(其中的https://github.com/username/Hello-World.git,是该项目的http,这可以在网页上得到,复制过来即可)
之后会要求输入用户名和密码
提交的命令是:
git push origin master