Git
一 Git介绍
说起Git用过的人应该都会说,Git是目前世界上最先进的分布式版本控制系统(没有之一)。说到版本控制系统,我这里就不进行详细说明了,可自行Google。
当前主流的版本控制系统有SVN, CVS 和 Git。对于SVN和CVS,这两个版本控制系统都是典型的集中式版本控制系统,而Git是一个分布式版本控制系统。
集中式版本控制系统:
版本库是集中存放在*服务器的,在工作的时候,用的都是自己的电脑,所以首先要先从*服务器取得最新的版本,然后开始干活,活干完之后,再把自己的活推送给*服务器。*服务器负责管理所有版本,离开*服务器就没法工作。
集中式最大的缺点就是,需要网络的支持。
分布式版本控制系统:
首先,分布式版本控制系统根本没有“*服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的*服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“*服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
二 Git的安装
在Linux系统下安装Git:
在命令行中输入git
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。
如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git
就可以直接完成Git的安装,非常简单。
在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
三 安装完成之后进行配置
在安装完之后,首先需要对git进行配置(在Linux中,或window的 git Bash中输入以下命令),
$ git config --global user.name "Declan"
$ git config --global user.email "aaa@qq.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
可以如下命令查看自己做配置的信息:
git config --global -l
四 创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录,然后在命令行切换道该目录下,执行命令:git init
即可创建一个将改目录初始化为一个git仓库。
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
五 Git 工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
1. 工作区
就是你通过git init
初始化过的文件夹
2. 版本库
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
六 git命令
1. 添加一个文件到git仓库: git add xxx (xxx为文件名) (git add . 将该仓库中所有没有添加到git仓库的文件全部进行添加)。
2. 提交命令:git commit -m "提交的说明"
3. 查看仓库状态:git status
4. 查看某个文件的修改的内容:git diff xxx (xxx为文件名)
5. 命令显示从最近到最远的提交日志: git log ,如果嫌输出信息太多,可以试试加上 --pretty oneline参数, git log --pretty=oneline (其中一连串数字的,表示是版本号 commit id)
6. 回退版本:在Git中,用HEAD
表示当前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
命令:git reset --hard HEAD^ 表示回退到上一版本
也可以使用git reset --hard 659646456 (其中一串数字表示commit id 可以不写全,写前几位即可,只要不重复)
可以通过命令:git reflog 查看每一次提交的命令(可以查找所有版本的commit id)
7. 对于文本文件可通过命令直接查看文件内容: cat readme.txt
8. 撤销修改:git checkout -- readme.txt。意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用git reset --hard HEAD^,不过前提是没有推送到远程库。
9. 删除文件:git rm readme.txt 进行删除,然后执行命令 git commit -m "注释"
如果文件删错了,可以使用 git checkout -- readme.txt进行回退
七 远程仓库
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-****** -t rsa -C "aaa@qq.com"
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:登陆GitHub或码云,设置SSH KEY:
以码云为例:
然后,点“SSH公钥”,填上任意标题,在公钥文本框里粘贴id_rsa.pub
文件的内容:
添加SSH 公钥是为了让码云识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,码云只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,码云允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到码云,就可以在每台电脑上往码云推送了。
Git常用命令:
1. 初始化一个git仓库:
git init
2. 配置git的全局用户名:
git config --global user.name "Declan"
3. 配置git的全局用户邮箱:
git config --global user.email "aaa@qq.com"
4. 查看配置的全局信息:
git config --list
5. 查看当前版本状态:
git status
6. 添加文件或修改到暂存区:
git add <file> / git add . #(添加所有的需要添加的文件或修改到暂存区)
7. 提交到版本库:
git commit -m "提交的注释内容"
8. 将add和commit合为一步操作:
git commit -am “提交的注释内容”#(只能提交已经追踪过且修改过了的文件)
9. 查看所有未添加至暂存区的修改:
git diff
10. 查看所有已经添加至暂存区,但还没commit的变更:
git diff --cached
11. 查看日志:
git log / git log --pretty=oneline #(日志单行显示) / git log --graph --pretty=oneline #(以图的形式展示日志)
git log -1 #显示最后一次提交的日志
12. 退回到上一个版本:
git reset --hard HEAD^ / git reset --hard HEAD~1 #(1 表示上一个 版本,2 则表示上上一个版本,以此类推)
git reset --hard <commit_id>
13. 查看每一次的操作记录:
git reflog
14. 查看工作区与版本库里最新版本的区别:
git diff HEAD -- <file>
15. 比较与上一个版本的区别:
git diff HEAD^
16. 丢弃工作区的修改:
git checkout -- <file> #(丢弃工作区指定文件还没有被add的修改)
git checkout . #(丢弃工作区内所有还没有被add的修改)
17. 丢弃暂存区的修改 (将add到暂存区的修改撤销):
git reset HEAD <file>
18. 删除版本库的一个文件:
git rm <file> / git rm -rf <file> #(递归删除,可以删除文件夹)
19. 生成ssh key:
ssh-****** -t rsa -C "aaa@qq.com" #(会在用户的根目录下/.ssh 先生成两个文件:id_rsa 和 id_rsa.pub)
校验远程仓库的ssh key是否添加成功:ssh -T aaa@qq.com
20. git的push命令:
git push <远程主机名> <本地分支名>:<远程分支名> #(例: git push origin declan将本地的declan分支推送至origin的declan分支,
如果远程declan分支不存在,则会创建该分支)
21. git的pull命令:
git pull <远程主机名> <远程分支名>:<本地分支名> #(例:git pull origin declan:declan_1 拉取远程origin的declan分支到本地的declan_1分支,
如果本地的declan_1分支不存在,则会创建该分支)
22. 本地仓库跟远程仓库建立连接:
git remote add origin <项目地址> # (将远程服务器上的项目跟本地已有的仓库关联起来,关联之后首 先就要进行远程代码的拉取pull和本地的推送push)
git pull origin master #(将远程仓库的内容拉至本地,并跟本地的master分支进行merge)
git push -u origin master #(将本地master分支推送到远程库的master分支中 加-u是为了将本地的master分支和远程库的master分支关联起来, 以后推送不需要加-u)
git push -u -f origin master #(将本地master分支强制推送到远程库的master分支中, -f表示强制推送,因为如果不加-f的话,可能会报错)
git clone <项目地址> #克隆一个远程仓库到本地
git remote rm origin #(删除本地已经关联的origin远程仓库)
分支管理
23. 创建分支:
git branch dev #创建dev分支
git checkout dev #切换到dev分支
git checkou -b dev #创建dev分支,并切换到dev分支
24. 查看分支:
git branch #(查看当前分支)
git branch -a #(列出所有分支)
git branch -vv #(查看本地当前分支信息)
git remote -vv #(查看远程仓库信息)
25. 分支合并:
git merge dev #(合并dev分支到当前分支)
26. 删除分支:
git branch -d dev #(删除本地dev分支)
git branch -D <name> #(删除一个没有被合并过的分支)
git push origin :dev #(删除远程dev分支,分支名前面的 : 表示删除分支, 等同于:git push origin --delete dev)
27. 查看分支合并图:
git log --graph --pretty=oneline --abbrev-commit
28. 禁用Fast forward 合并(分支管理策略:如果是Fast forward模式合并,删除掉分支后,会丢掉分支的提交信息,所以为了保留分支的提交信息,需要禁用Fast forward)
git merge --no-ff -m “注释”dev #在合并的时候同时提交,合并后的历史有分支,能看出来曾经做个合并
29. git 保存工作现场:(使用与修复bug,在当前分支没有提交的情况下,新建一个新的临时分支)
git stash # 存储当前工作现场
git stash list # 查看保存的工作现场
git stash apply # 恢复stash内容,但是不会删掉保存的stash
git stash apply aaa@qq.com{0} #恢复指定的stash
git stash drop # 删掉保存的stash
git stash pop # 恢复stash内容,同时删除保存的stash
30. 抓取远程仓库的某个分支:
git checkout -b dev origin/dev #在本地创建dev分支,同时将该分支与远程origin的dev分支关联起来
31. 建立本地分支和远程分支的关联:
git branch --set-upstream-to=origin/<remote_branch> <your_branch> # 该命令在建立关联前,本地分支必须存在,不会自动创建本地分支
git branch --set-upstream <your_branch> origin/<remote_branch> #该命令建立关联的过程中,如果本地的分支不存在,则会自动创建本地分支
32. rebase把分叉的提交历史“整理”成一条直线:
git rebase #把本地未push的分叉提交历史整理成直线
标签管理
33. 创建标签:
git tag <name> # 创建标签,如 git tab v1.0 该标签默认是在最新的commit上打的
git tag <name> <commitId> #在指定的commit id处打tag
git tag -a <name> -m <说明文字> <commitId> #-a 后面为tag名,-m后为该tag的说明,commitId是指为哪个提交打tag
34. 查看所有标签:
git tag #列出所有的标签
35. 查看标签的详细信息:
git show <tag_name>
36. 删除标签:
git tag -d <tag_name>
37. 推送标签到远程:
git push origin <tag_name> #创建的标签都只保存在本地,需要手动推送到远程仓库
git push origin --tags #一次性推送全部尚未推送到远程的本地标签
38. 删除已经推送的tag:
首先删除本地:git tag -d <tag_name> , 然后从远程删除:git push origin :refs/tags/<tag_name>
Git的配置
- Git忽略文件 .gitignore
git add -f App.class #如果在.gitignore中已经添加了忽略.class文件,那么加上-f 就是强制添加到git
git check-ignore -v App.class #检查某个文件是否在.gitignore文件中已经添加忽略
2. Git配置别名
git config --global alias.st status #为status配置了别名 st, 配置后就可以用 :git st 替代命令:git status了
例:git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" # 格式化了log,以后查看log就可以直接使用命令:git lg 了
3. Git配置文件
每个仓库的git配置文件在该仓库的 .git/config 中
当前用户的git配置文件放在用户主目录下的一个隐藏文件:.gitconfig中
在对git进行配置时,如果加上 --global, 是针对当前用户起作用,如果不加,则只是针对当前仓库起作用
转载于:https://my.oschina.net/Declan/blog/1789683
推荐阅读
-
解决idea 拉取代码出现的 “ Сannot Run Git Cannot identify version of git executable: no response“的问题
-
git 问题
-
Git 项目推荐 | Go 语言编写的 web 完全开发框架_html/css_WEB-ITnose
-
cannot run program "git.exe":CreateProcess
-
git 基本使用
-
Spring Boot中使用Actuator的/info端点输出Git版本信息
-
25个 Git 进阶技巧(翻译)
-
C#/.NET使用git命令行来操作git仓库的方法示例
-
.NET Corek中Git的常用命令及实战演练
-
Android studio怎么使用git获取最新内容然后合并?