目录
获取Git仓库
创建一个本地仓库
如果想对现有项目进行管理,只需要在项目目录下输入:
git init
该命令创建.git子目录,这个子目录下含有git仓库中所有的必须文件。但是由于我们仅仅进行了初始化,所有没有任何文件被跟踪。需要使用git add命令跟踪文件,然后git commit进行提交。
git add file/dir
git commit -m "message"
注意:此处创建的为一个本地仓库,可以在本地仓库上进行基本的操作,但是因为没有与一个远程仓库关联,所以无法进行push、pull、fetch等操作,关联远程仓库方法:
git remote add remotename URL
example:git remote add origin https://github.com/eyunhua/screen-slide-yearbill.git
克隆现有仓库
如果想在某个现有的git仓库上进行修改,则可以使用git clone命令。格式为:
git clone URL
eg:git clone https://github.com/libgit2/libgit2
URL为gitlab或github上创建项目的链接。
可以给命名文件夹
git clone URL dirname
eg:git clone https://github.com/libgit2/libgit2 mylibgit
记录每次更新到仓库
使用git时,git中文件生命周期如下
工作目录中的文件处于两种状态:已跟踪和未跟踪。已跟踪表示已经纳入版本控制的文件,在上一次提交的快照中有它们的记录,经过一段时间后可能处于未修改、已修改、以暂存的状态。
跟踪/暂存文件
$ git add
当文件未跟踪,使用git add file时,则将此文件加入跟踪并加到暂存区,
当文件已跟踪,则将此文件加入暂存区
当git add后接目录时,则对目录下所有进行操作
此外,当此命令后接 "." 时,则对当前目录下所有文件操作(除去.gitignore中文件)
所以这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适
检查文件当前状态
检查当前所有文件处于什么状态。
$ git status
也可以使用
$ git status -s
$ git status --short
两个命令一样,获取状态的简洁形式。
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
第一行的M靠右,表示已修改未放入暂存区,第二行左边M表示已修改并放入暂存区,A表示新跟踪文件,??表示未跟踪文件。
忽略文件
在项目管理目录下创建.gitignore文件。在其中写入部分文件格式或目录,则git操作时会对这些文件或目录进行忽略。
# C++ objects and libs
/bin/
/lib/
/include/
*.slo
*.lo
*.o
以#开头的为注释。其他则为目录或文件。
TIPS:GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在https://github.com/github/gitignore 找到它.
查看已暂存和未暂存的修改
git diff
此命令是查看暂存区和工作目录的修改,如果当前修改已暂存,则什么都没有。
如果想查看暂存区与已提交的修改,则添加--cached或--staged
git diff --cached
git diff --staged
提交更新
git commit -m "mesage"
先对文件使用add命令暂存后,使用commit进行提交到本地仓库,-m后接的是对此次提交的描述信息
可以通过-m前加-a跳过暂存区步骤(注:仅对已跟踪的文件有效)
git commit -a -m "test -a -m"
git commit -am "test -am"
移除文件
git rm
此操作是针对git仓库的文件操作的,移除已跟踪文件,并将工作目录中对应文件删除,下次提交将不再纳入版本管理。
但是如果暂缓区域文件未提交到仓库(如新加的文件,或者已提交的文件有修改),则无法通过此命令删除(确保修改的数据已提交,防止误操作丢失数据)。此时可以使用-f进行强制删除。
git rm -f files
另外一种情况,就是删除仓库的文件,可以通过加--cached操作
git rm file --cached
移动文件
git mv filefrom fileto
git mv有两层意思,一层是重命名,另一层是移动文件。
查看提交历史
git log
此命令会将整个提交历史的所有信息打印,几个常用的options
后接-p可以仅显示每次提交的差异。
后接-n可以显示条数(可以与-p配合使用)
--oneline,一行显示
--pretty=format,不同的格式显示
--graph,查看分支、合并历史
以上的所有操作可以配合使用
git log --oneline --decorate --all --graph
撤销操作
如果想将上次已提交的内容替换,可以使用--amend
git commit --amend
git commit -m "commit describe" --amend
--amend(修改)作用是提交暂存区内容并对上次提交进行修改,所以第一条语句是将上次提交后的一些操作修改到上次提交,语句二是将上次提交的提示信息修改。
撤销对暂存区操作
git reset HEAD file
将会撤销对暂缓区的修改,将已提交文件输出到当前暂存区。不加HEAD可以,此外暂存区始终只有一层。
撤销对工作目录文件操作
git checkout -- file
此命令是十分危险的因为工作目录如果未保存到数据库,直接执行此操作则将导致数据不可挽回的丢失。
此操作是将上次提交的文件内容覆盖工作目录相同文件。不加--也可以识别。
远程仓库使用
查看远程仓库
git remote
会显示当前目录下的所有远程仓库。
加-v后显示对应的[URL].
$ git remote -v
origin http://192.168.8.211/yao/GitTest.git (fetch)
origin http://192.168.8.211/yao/GitTest.git (push)
test http://192.168.8.211/yao/GitTesttwo.git (fetch)
test http://192.168.8.211/yao/GitTesttwo.git (push)
添加远程仓库
使用git remote add <shortname> <url>命令可以添加一个远程仓库,并以<shortname>命名仓库,可以使用<shortname>代替远程仓库的[URL]。
可以用此命令将远程仓库与本地仓库关联。
此外可以将远方的一个仓库代码clone后修改再push到新的远程仓库中。
远程仓库的拉取、抓取和推送
拉取:git fetch
抓取:git pull
两者的区别是,pull命令是会自动进行合并,而fetch并不会,需要自己进行merge操作。
推送:git push remote-name branch-name
将remote-name推送到分支branch-name上,或者将所有分支push到远程仓库使用git push --all。
查看仓库
git remote show remote-name
仓库移除和重命名
重命名:git remote rename namefrom nameto
移除:git remote rm remote-name
打标签
列出标签
git tag
git tag -l -n
前者直接列出标签,后者会带详细信息
$ git tag
1.1.0
1.2.0
v1.3.0
$ git tag -n
1.1.0 origin version
1.2.0 modify protocol's infoaddr
v1.3.0 test
创建标签
标签分为轻量标签(lightweight)和附注标签(annotated)
后者完整性好,带有详细信息,存储在数据库中的一个对象。建议使用后者。
附注标签
git tag -a v1.0.0 -m "describe"
注意:如果工程中有pri版本控制文件,则tag名不能有数字外的内容。
轻量标签
git tag v1.1.0
比附注标签简单
后期打标签
可以使用git log --pretty=oneline获取提交的校验和,然后在附注标签命令最后添加校验和,则将附注标签打到对应提交上,如果不带校验和则打到当前提交上。
共享标签
因为git push命令是不会主动将标签推送到远程仓库上的,所以需要用
git push remote-name tag-name,将本地标签推送到远程仓库
另外可以用--tags,将本地所有标签推送
git push remote-name --tags
删除本地标签
git tag -d tag-name
删除仓库标签
与共享标签一样,本地删除标签不会影响远程仓库,如果想同步同样需要推送到远程仓库
git push remote-name :refs/tags/tag-name
检出标签
git checkout tag-name