首先本文参考廖雪峰的git学习教程,写的非常好,值得学习。
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
一、git源码包安装:
因yum安装的版本太低,故下载最新版本git-2.7.0.tar.gz和git-manpages-2.7.0.tar.gz,下载URL:
https://www.kernel.org/pub/software/scm/git/
建议下载git-manpages-2.7.0.tar.gz,并解压后的man放置到系统的/usr/share/man目录下,或者修改/etc/man.config配置文件,添加MANPATH路径指向你的解压目录即可使用man查看git的具体详细帮助。
二、git使用介绍:
1、设置当前Git仓库的身份认证:
git config --global user.email "[email protected]" git config --global user.name "David" 2、git添加文件或目录: git add -u [<path>]: 把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。 省略<path>表示.,即当前目录。 git add -A: [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。 省略<path>表示.,即当前目录。 3、git查看日志及版本回退: git log --
pretty=oneline
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上此参数 日志中有commit_id号,即HEAD版本。
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
4、git
工作区和暂存区: 工作区(Working Directory):就是你在电脑里能看到的目录 版本库(Repository) 工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。 5、git diff比较: 主要是对工作区、暂存区和git分支的理解:
git diff:是查看working tree与index file的差别的。
git diff --cached:是查看index file与commit的差别的。
git diff HEAD:是查看working tree和commit的差别的。
(1). git diff:
默认是对比工作区和暂存区,举例说明:
初始状态: [[email protected]_168_174_62 git]# cat readme nihao welcome 修改readme: [[email protected]_168_174_62 git]# cat readme nihao welcome 1 2 3 在没add之前,暂存区没内容,个人理解是获取了分支里的内容: [[email protected]_168_174_62 git]# git diff readme diff --git a/readme b/readme index 07ee8c0..d603750 100644 --- a/readme +++ b/readme @@ -1,2 +1,5 @@ nihao welcome +1 +2 +3 在add之后,暂存区和工作区的比较: [[email protected]_168_174_62 git]# git add -u You have mail in /var/spool/mail/root [[email protected]_168_174_62 git]# git diff readme [[email protected]_168_174_62 git]#
(2).git diff [--options] <commit> [--] [<path>...]
将工作区跟指定的版本进行比较:
[[email protected]_168_174_62 git]# git diff 57ad1dc readme diff --git a/readme b/readme index 07ee8c0..d603750 100644 --- a/readme +++ b/readme @@ -1,2 +1,5 @@ nihao welcome +1 +2 +3 [[email protected]_168_174_62 git]# git diff 66ad45b readme diff --git a/readme b/readme index c83ca87..d603750 100644 --- a/readme +++ b/readme @@ -1,5 +1,5 @@ nihao welcome -a -b -c +1 +2 +3
(3). git diff --cached :
git diff [--options] --cached [<commit>] [--] [<path>...]
This form is to view the changes you staged for the next commit relative to the named <commit>. Typically
you would want comparison with the latest commit, so if you do not give <commit>, it defaults to HEAD. If
HEAD does not exist (e.g. unborn branches) and <commit> is not given, it shows all staged changes. --staged
is a synonym of --cached.
个人理解:是暂存区跟指定版本的分支内容进行比较。举例说明:
初始状态: [[email protected]_168_174_62 git]# cat readme nihao welcome 修改后: [[email protected]_168_174_62 git]# cat readme nihao welcome 1 2 3 使用--cached进行比较: 在add之前无差异: [[email protected]_168_174_62 git]# git diff --cached readme [[email protected]_168_174_62 git]# 暂存区跟分支中是一样。 在add之后有差异: [[email protected]_168_174_62 git]# git add readme You have mail in /var/spool/mail/root [[email protected]_168_174_62 git]# git diff --cached readme diff --git a/readme b/readme index 07ee8c0..d603750 100644 --- a/readme +++ b/readme @@ -1,2 +1,5 @@ nihao welcome +1 +2 +3 暂存区跟当前分支中是不一样的。 跟其他分支版本进行比较: [[email protected]_168_174_62 git]# git diff --cached 66ad45b readme diff --git a/readme b/readme index c83ca87..d603750 100644 --- a/readme +++ b/readme @@ -1,5 +1,5 @@ nihao welcome -a -b -c +1 +2 +3 [[email protected]_168_174_62 git]#
6、git checkout -- file
可以丢弃工作区的修改,即撤销修改:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。或者直接使用git reset --hard HEAD
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库。
(1).撤销工作区的修改符合就近原则:
工作区
< - 缓冲区
<- 版本库
- 撤销工作区修改,如果缓冲区有该文件,则checkout -- file 会将缓冲区的内容覆盖到工作区,此时工作区和缓冲区文件内容相同,因此工作区是干净的,并没有未add的文件。
- 撤销工作区修改,如果缓冲区没有该文件,则checkout -- file命令会继续向上找,找到版本库中的该文件,此时使用版本库中的文件覆盖工作区,工作区干净
(2).撤销缓冲区
- 撤销缓冲区,使用git rest HEAD -- file ,则会将直接丢弃缓冲区中的相应内容,只剩下工作区的版本。缓冲区中内容并没有覆盖到工作区,而是直接清除。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
注:git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
三、远程仓库GitHub:由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密1、创建SSH Key: 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
2、
登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容。
3、创建github上的仓库,并与本地进行同步:
要关联一个远程库,使用命令git remote add origin [email protected]:path/repo-name.git
;
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
git remote add origin https://github.com/wushank/python.git
[[email protected]_168_174_62 python]# git push -u origin master (gnome-ssh-askpass:23186): Gtk-WARNING **: cannot open display: error: unable to read askpass response from ‘/usr/libexec/openssh/gnome-ssh-askpass‘ Username for ‘https://github.com‘: wushank (gnome-ssh-askpass:23201): Gtk-WARNING **: cannot open display: error: unable to read askpass response from ‘/usr/libexec/openssh/gnome-ssh-askpass‘ Password for ‘https://[email protected]‘: Counting objects: 28, done. Delta compression using up to 8 threads. Compressing objects: 100% (26/26), done. Writing objects: 100% (28/28), 879.65 KiB | 0 bytes/s, done. Total 28 (delta 4), reused 0 (delta 0) To https://github.com/wushank/python.git * [new branch] master -> master Branch master set up to track remote branch master from origin.