1. 创建版本库并提交文件
1.创建一个版本库
git init :把这个目录变成Git可以管理的仓库
ls -ah:可以看到隐藏的.git目录
2.将文件添加到版本库中
git add :告诉Git,把文件添加到仓库
git commit -m "提交的说明":告诉Git,把文件提交到仓库
注意:提交修改和提交新文件都是需要两个步骤,add和commit
为什么Git提交文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
2. 查看状态
- 查看文件是否被修改过:git status
- 查看修改的内容:git diff
3. 查看提交的日志
- 不加参数:git log
- 加参数:git log --pretty=oneline
出来的一大串数字是commit id(版本号)
4. 版本回退
进行多次修改后,想要回到某一个版本
- 回到上一个版本
git reset --hard HEAD^ - 回到上上个版本
git reset --hard HEAD^^ - 回到某个版本,比如往上100个版本
git reset --hard HEAD~100 - 查看回退后的内容,比如查看readme.txt回退后的版本
cat readme.txt - 当新版本已经看不到看,又想回去时
(1)如果在回退之前查看日志log,并且命令窗口还没被关掉,可以顺着往上查找,找到你想要回退的commit id,就可以执行回到最新版本
git reset --hard 1094s
版本号没必要写全,前面几位就可以了,Git会自动去找
(2)如果在回退之前没有查看日志
git reflog 记录每一条命令
再通过回退版本号就可以了
5. 工作区和暂存区
- 工作区(Working Directory):电脑里能看到的目录
- 版本库(Repository)
(1)工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
(2)版本库有很多东西,版本库中有一个stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。 -
提交文件的过程
git add命令实际上就是把要提交的所有修改放在暂存区(Stage)
然后,执行git commit就可以一次性把暂存区的所有修改提交到分支上(master)
6. 撤销修改
git checkout 文件
(1)文件自修改后还没被放到暂存区(也就是还没有git add),把文件在工作区的修改全部撤销
(2)已经添加到暂存区,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
7. 删除文件
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交。记住,必须先提交后才能进行删除文件。
(1)rm 文件
只把文件A从工作目录删除,而没有在暂存区进行删除,如果需要删除暂存区的文件,需要先git add,然后执行git commit -m "remove xxx",或者下面一种做法:
rm A
git commit -am "xxx"
(2)git rm 文件
相当于rm+git add,先把文件A从工作目录删除,再从暂存区删除文件A,最后执行git commit。
git rm A
git commit -m "xxx"
8. 远程仓库
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。
实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
这时候,GithHub就是我们的远程仓库,也就是充当服务器的角色,我们可以将本地仓库推送到远程仓库上。
本地Git仓库和远程仓库GitHub之间的传输是通过SSH加密(什么是SSH?https://www.jianshu.com/p/5b0351a4ad3d)的,所以我们要进行设置。
(1)创建SSH Key。在我们本地用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
(2)登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
为什么GitHub需要SSH Key呢?
因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送(因为你有对应的私钥)。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
9. 添加到远程库
在GitHub创建一个Git仓库,让本地仓库和Git仓库进行远程同步。
在添加到远程库之前,确保文件已经在本地仓库中(即已经git add和git commit)。
(1)在GitHub新建一个test仓库。
(2)在本地仓库下运行命令:
$ git remote add origin git@github.com:whitewhite123/test.git
(3)将内容推送到远程,用git push 命令,实际上是把当前分支master推送到远程。
$ git push -u origin master
第一次推送master分支时,需要加上-u 参数。Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,直接git push。
10. 从远程仓库克隆
git clone 远程仓库地址
$ git clone git@github.com:michaelliao/gitskills.git
11. 创建与合并分支
- 创建分支dev,然后切换到dev分支
git checkout -b 分支名
$ git checkout -b dev
跟下面两句是一样的
//创建分支dev
$ git branch dev
//切换到分支dev
$ git checkout dev
- 切换分支
git checkout 分支名 - 查看所有的分支
git branch
其中,有*号代表当前分支 - 合并分支
git merge 分支名
在其中一个分支做操作,另一个分支是看不到的,在最后可以进行合并。
(1)先切换到master分支
$ git checkout master
(2)然后将dev分支合并到master分支
$ git merge dev
- 删除分支
合并完成后,就可以放心删除dev分支了
git branch -d 分支名
6.查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
12. 分支管理
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
所以,要禁用Fast forward模式,使用--no-ff参数,表示禁用Fast forward。
当前在master分支,想要合并dev分支。
git merge --no-ff -m "merge with no-ff" dev
这样,就算后面删除dev分支,也可以用git log得到commit id,进行版本回退。
13. 解决冲突
(1)一开始,readme.txt的内容为:
aa
(2)在master分支下修改readme.txt的内容:
aa
bb
提交(add+commit)
(3)新建一个分支dev,然后修改readme.txt的内容:
aa
cc
提交(add+commit)
(4)切换到master分支,进行合并dev分支,会出现冲突,打开readme.txt
aa
<<<<<<< HEAD
bb
=======
cc
>>>>>>> dev
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
我们进行修改,然后再进行提交,最后删除分支dev。
13.Bug分支
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你在dev分支的时候,你接到master分支上的一个代号101的bug的任务时,你需要去修复,但是dev分支的工作做到一半,还没法提交,这时候,你可以使用以下命令,将现场工作“储藏”起来,等恢复现场后继续工作。
- git stash 将当前现场隐藏
- 切换到master
git checkout master
用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
(1)创建一个临时分支
git checkout -b issue-101
进行现场修复bug后提交
(2)修复完成后,切换到master分支进行合并,并删除issue-101分支 - 重新回到dev分支
(1)git stash list 查看
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下。
(2)恢复现场
第一种:git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
第二种:git stash pop,恢复的同时把stash内容也删了。
(3)再用git stash list查看,就看不到任何stash内容了。
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
14.强行删除
当你添加一个新功能时, 你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
- 于是,开发一个新功能,添加一个分支
git checkout -b feature-new
- 切回master,准备合并
当你要合并时,上级突然说撤销这个新功能,还必须就地销毁
使用
git branch -d feature-new
销毁失败
所以必须强行销毁,使用-D
git branch -D feature-new
16. 推送分支(push)
- 查看远程库的信息
git remote
查看更详细的信息
git remote -v - 推送分支
如果想把master分支进行推送
git push origin master
如果想推送其他分支,比如dev
git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
17. rebase命令
git rebase 分支名:可以帮我们把整个提交历史变成干净清晰的一条线。
再使用 git log --graph --pretty=oneline --abbrev-commit查看分支合并情况