git详细笔记

637 查看

git配置相关

查看git各项配置

$ git config --list

配置用户名和邮箱

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

添加暂存区

$ git add filename1 filename2 filename3 ....
$ git add .

添加版本库

$ git commit -m"add files"

注意,commit操作只会提交已经add了的文件,也就是已经存在暂存区中的文件了,没有add的文件不会被提交

对比

$ git diff filename1

git diff 是对比上次add(暂存区)和当前修改(工作区)的对比。

diff只能监测行的改动,对行的每一个操作都会被认为删除当前行,新加了一个不一样的行。1 deletion(-),1 insertion(+)

简单理解就是对比add前和add后的对比

特别注意,假如commit了,不要误认为暂存区区就没有内容了,diff命令就失效了,此时暂存区内仍有最近一次add的内容,所以diff命令依然会比较当前工作区和暂存区的区别

git diff:是查看working tree与index file的差别的。
git diff --cached:是查看index file与commit的差别的。
git diff HEAD:是查看working tree和commit的差别的。
git diff HEAD -- readme.txt 和版本库对比
git diff -- readme.txt 和暂存区对比

git diff HEAD -- readme.txt命令是对比当前工作区readme.txt文件和版本库中readme.txt文件的区别,注意,这个命令跨过了暂存区进行对比

查看日志

完整显示

$ git log

最近的提交在上面,最早的提交在下面

简单显示方式

git log --pretty=oneline

版本回退

HEAD代表当前版本,HEAD^代表上一个版本,上上个版本就是HEAD^^,依次类推,HEAD~25则是回退到上25个版本,下面命令是回退到上个版本,也可以使用git reset --hard HEAD~git reset --hard HEAD~1一样的效果

$ git reset --hard HEAD^

也可以通过版本号的方式进行,下面就是回退到git log里的版本号为48122212的版本

$ git reset -hard 48122212

假如有A3、A2、A1三个版,当前在A3版本,使用命令回退到了A2的版本,只要当前命令窗口没有关闭,可以找到在git log时,显示的A3的版本号,即可使用git reset --hard A3版本号命令“恢复”到A3的版本

不过,如果窗口关闭了也没有事,使用如下命令,即可显示操作的每一次命令,并且有版本号,此时应该明白如何回退了吧

$ git reflog

修改工作区后回退和add后的回退

vim readme.txt 修改
$ git checkout -- readme.txt 还原修改之前


vim readme.txt 修改
$ git add readme.txt 
$ git checkout -- readme.txt 不能还原修改之前

需要
$ git reset HEAD readme.txt 清除暂存区的add
然后再
$ git checkout -- readme.txt 还原之前修改


另外个方法
vim readme.txt 修改
$ git add readme.txt 
$ git checkout -- readme.txt 不能还原修改之前


直接
git reset --hard 版本号
直接回退到某版本号,暂存区也清空

删除文件回退方法(修改同理)

一、rm只删除工作区信息;

使用 git checkout -- file即可恢复;

二、git rm 删除工作区和暂存区信息;

1、使用git reset HEAD -- file即可恢复;

2、恢复步骤:

1)先使用git reset HeAD -- file从版本库把已删除信息copy到到暂存区;

2)再使用git checkout -- file从暂存区把已删除信息copy到工作区。over!!!

3)这时你就看到删除的文件又回来啦。啦啦啦!

三、git commit -m “file”删除工作区,暂存区和版本库信息;

1、使用git reset --hard HEAD^即可恢复或git reset HEAD^。
`特别说明`
git reset --hard HEAD^
彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自上一次以来的提交全部丢失。
git reset HEAD^ <指定文件,不写即全部>
工作不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。

2、恢复步骤:
1) git reset HEAD^ <指定文件,不写即全部>

1)最后,使用git checkout -- file从暂存区把已删除信息copy到工作区。

1)这时你就看到删除的文件又回来啦。啦啦啦!

以上我都亲自试过,很好用。

远端库

origin是远端库的默认名称,也可以改成自己喜欢的名字,无意外,建议默认
本地库关联远端库(先有本地库,后有远端库,二者要关联)

git remote add origin 这里换成github上的库地址

或者克隆远端库到本地(本地库没有,直接克隆远端库到本地)

git clone 这里换成github上的库地址

修改本地库和远端库的关联

git remte origin set-url 这里换成github上的库地址 

master是远端库的名字,也是默认的,建议不动
使用关联远端库的方式的推送

# `-u`的意思是关联本地`master`和远端库的意思`master`
# 往后的推送命令就是用git push origin master推送即可,不需要加-u了,
# 只是第一次要加而已
git push -u origin master

使用克隆的方式的推送

git push origin master

查看远端库

git remote -v

分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

此时就在分支下进行编辑,之后一样add和commit进行操作~

合并某分支到当前分支:git merge <name>(此为快速合并Fast forward,出现冲突的时候就必须手动清除冲突了)

删除分支:git branch -d <name>

清除冲突

建分支,add和commit切换回master,在master下merge 下dev分支报错了,需要清除冲突!

$ git merge dev
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

查看冲突文件如下,HEAD代表当前分支内容,dev代表分支内容,手动去掉冲突内容或者直接全部不要写新的内容都可以,反正要去掉<<<<====>>>>HEADdev这几个标记

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev

之后再add和commit,此时分支冲突就解决了

$ git add readme.txt 
$ git commit -m "conflict fixed"
[master 59bc1cb] conflict fixed

不过不太建议使用Fast forward快速合并模式,为什么后面说明

查看分支情况,简单版

git log --graph --pretty=oneline --abbrev-commit

查看分支情况,详细版

git log --graph

为什么不建议使用Fast forward模式?

因为使用Fast forward快速何必模式,会丢失分支信息,看不出做出个分支合并的操作,多人开发时,出现问题不好定位,所以merge的时候使用普通模式--no-ff
原来的git merge dev改成如下命令

git merge --no-ff -m "merge with no-ff" dev

意思是使用普通模式合并(会保留分支信息),这样git会merge的时候生成一个新的commit

查看时使用下面命令,就可以看出分支合并的操作了

git log --graph --pretty=oneline --abbrev-commit