git 记录
参考网址:http://http://www.liaoxuefeng.com/,里面的Git教程,学得很好,感谢廖老师的Git教程。
一、简单介绍
- Git是分布式版本控制系统
- 集中式版本控制vs分布式版本控制
- 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器
- 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
- 集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
- 在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
二、安装记录
三、常用命令
1、设置用户名和邮箱。git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置
//
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
2、创建版本库
在合适的工作目录,创建文件夹,在创建的文件夹当前目录执行
git init
创建成功后,当前目录下多了一个.git的目录,这个目录默认是隐藏的
3、把文件添加到仓库,比如这里创建了一个文件readme.txt
git add readme.txt
4、把文件提交到仓库
git commit -m "first commit"
-m 后面输入的是本次提交的说明,方便后面查询提交记录,和方便其他人阅读
5、查看当前仓库的状态,可以显示改动了的文件
$ git status
On branch master
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.txt
no changes added to commit (use "git add" and/or "git commit -a")
6、查看具体的改动
git diff readme.txt
通过这个命令可以显示具体修改的内容
7、查看历史提交记录
$ git log
commit cc592f6abc70df78d25713af7f3977f67d3d9d66
Author: cigar0223 <415718252@qq.com>
Date: Wed Apr 19 16:00:06 2017 +0800
add readme.txt
commit 0dba4155dc928b6d9e9be4a4fc4fb39cdd9433df
Author: cigar0223 <415718252@qq.com>
Date: Wed Apr 19 15:57:37 2017 +0800
first commit
加–pretty=oneline可以方便查看
$ git log --pretty=oneline
cc592f6abc70df78d25713af7f3977f67d3d9d66 add readme.txt
0dba4155dc928b6d9e9be4a4fc4fb39cdd9433df first commit
8、版本回退
$ git reset --hard HEAD^
HEAD is now at 0dba415 first commit
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
$ git reset --hard 0dba41
HEAD is now at 0dba415 first commit
可以在–hard后面指定git log 查询出来的commit id,就可以指定到某一个版本,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号
9、查看当前文本内容
$ cat readme.txt
init
cat可以查看文件的内容
10、查询历史执行命令
$ git reflog
cc592f6 HEAD@{0}: reset: moving to cc592f
0dba415 HEAD@{1}: reset: moving to HEAD^
cc592f6 HEAD@{2}: commit: add readme.txt
0dba415 HEAD@{3}: commit (initial): first commit
11、查看工作区和版本库里面最新版本的区别
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 5669882..b0dd824 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,5 @@
init
add
-modify
\ No newline at end of file
+modify
+
+log log
\ No newline at end of file
12、丢弃工作区的修改
git checkout -- readme.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
13、把暂存区的修改撤销掉(unstage),重新放回工作区
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
14、删除一个文件
$ git rm second.txt
rm 'second.txt'
15、与远程仓库关联
git remote add origin https://git.coding.net/Cigar0423/gitStudy.git
16、把本地库推送到远程仓库
git push -u origin maste
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
git push origin master
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
17、从远程库克隆到本地
git clone https://git.coding.net/Cigar0423/gitStudy.git
18、创建并切换到分区
$ git checkout -b work
Switched to a new branch 'work'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
git branch work
git checkout work
19、查看当前分支
$ git branch
master
* work
20、合并分支
$ git merge work
Updating 0d14e2b..e29e6eb
Fast-forward
second.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 second.txt
合并分支要先切到最终要合并到的分支
21、删除分支
$ git branch -d work
Deleted branch work (was e29e6eb).
22、看到分支合并图
git log --graph
23、以强制禁用Fast forward模式合并分支
git merge --no-ff -m "merge with no-ff" work
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
24、把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash
查看存储的工作现场
git stash list
恢复工作现场,但是恢复后,stash内容并不删除
git stash apply
恢复后,删除stash内容
git stash drop
恢复的同时把stash内容也删了
git stash pop
25、强行删除未提交的分支
git branch -D work
26、查看远程库信息
git remote
27、显示远程库详细信息
git remote -v
28、推送分支,就是把该分支上的所有本地提交推送到远程库
git push origin master
29、从远程抓取分支
git pull
30、在本地创建和远程分支对应的分支
git checkout -b branch-name origin/branch-name
31、建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
32、创建标签
git tag v1.0
git tag v0.9 6224937
v0.9后面是commit Id
33、查看所有标签
git tag
34、创建签名并指定标签信息
git tag -a v0.1 -m "version 0.1 released" 3628164
35、用PGP签名标签
git tag -s v0.2 -m "signed version 0.2 released" fec145a
36、查看标签信息
git show v0.9
37、删除标签
git tag -d v0.1
38、推送某个标签到远程
git push origin v1.0
39、一次性推送全部尚未推送到远程的本地标签
git push origin --tags
40、删除一个远程标签
git push origin :refs/tags/v0.9
41、让Git显示颜色,会让命令输出看起来更醒目
git config --global color.ui true
42、强制添加被.gitignore忽略的文件
git add -f App.class
43、检查忽略规则
git check-ignore -v App.class
44、
git config --global alias.st status
配置Git的时候,加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。配置文件放在.git/config文件中。
四、工作区和暂存区
1、工作区
就是我们在电脑里能看到的目录
2、版本库
- 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区
- 还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
3、流程
- git add把文件添加进去,实际上就是把文件修改添加到暂存区
- git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支
- 因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改
五、忽略特殊文件
1、Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
2、忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。