1. git init
我们从初始化一个仓库开始,通过此命令可以初始化一个仓库
git init
首先我们在当前目录下创建一个目录pratice和一个文件test.js
mkdir pratice
cd pratice
touch test.js
ls
然后我们修改一下test.js文件,给它加上一句代码console.log(1)
vim test.js
2. git status
查看当前分支仓库状态
git status
3. git add
将工作区中的代码提交到缓存区中
- git add . 全部暂存
- git add [filename]
git status
git add .
这时我们已经在暂存区中新增了一个文件了
4. git commit
将提交到缓存区中的代码保存到本地仓库中
- git commit -m '提交备注' 平时用得比较多的就是-m了,后面可以加上本次提交需要备注的信息
- git commit 有时候手一抖,直接就回车了,那么会进入vim编辑器,备注下本次提交的信息即可(具体vim操作可以某度一下学习)
- git commit -a -m '提交备注' 带上一个-a可以将工作区中还没有add的代码也commit了,相当于是将add和commit两次操作合并了
- git commit --amend 更改最近一次提交的信息,这个操作就优秀了,目前我发现的大致是以下两个用处
- 比如我上一次提交的是修改了某个bug,这一次我又是修改了那个bug,然后我要将这一次的修改和上一次的提交用同一个commit备注,那么你可以使用这个命令,将会使用上一次的commit备注信息,同时生成一个新的commitId,
- 你想把本次的修改提交到上一次的提交中,并且把上一次备注的提交信息改成这次的
git log
vim test.js
// 新增console.log(2);
git add .
git commit --amend
你会发现当前commit的id变了,并且上一次的commit被合并到这一次commit当中,使用了这一次新生成的id
5. git merge
此操作用于合并commit,具体而言就是将需要合并的分支上的最后一次commit merge到当前分支的最后一次commit上
我们通过git checkout -b test创建和切换一个新的分支test
目前两个分支的都指向一个commit id
接下来我们在test上修改test.js,添加console.log(3);然后执行add和commit操作,并切换回master分支使用git merge test
vim test.js
git add .
git commit -m 'modify test.js in branch of test'
现在所有分支状态是这样的
git checkout master
git merge test
合并后分支状态是这样的
merge用处
- 首先就是merge其他分支代码
- 其次当pull拉下远程仓库最新代码时,这时git会自动将远程仓库最新代码merge到本地仓库当前分支上
冲突情况
- 当开发人员A改了文件test1.js,并commit后,开发人员B改了文件test2.js,并commit。这时开发人员B merge开发人员A的代码,这时合并后提交一个新的commit,并且这两个修改的文件都有效。
- 当开发人员A和开发人员都改了文件test1.js某一行代码,并且都commit了。开发人员A如果去merge开发人员B的代码,这时会产生一个conflict,使开发人员A进入冲突解决状态,打开test1.js会看到冲突的代码处,git已经无能力去处理到底谁的代码是你要的,但是它会提示冲突处,留待开发人员去处理,
解决方案
1 开发人员手动解决冲突后,在git add .和git commit提交冲突,这时会自动加上上一次commit的备注信息,因为刚刚进入的是一个conflict冲突修改状态。
2 如果开发人员放弃解决冲突,可以通过git merge --abort,将会回到merge分支前的状态
实际试试
首先程序A修改了test.js文件把第三行代码改成了输出4,并commit了
程序B修改了test.js文件把第三行代码改成了输出5,并commit了
这时候的分支图
这时候程序员B要合并程序员A的代码,
git merge test
我们通过vim打开test.js文件看看
OK,然后我们认为程序A修改无效,采用我的方案
git add .
git commit
这时候我们看看分支图
6. git log
- git log 查看历史commit记录
- git log --patch 或者 git log -p 查看每个commit的改动细节
- git log --stat 查看简要改动信息,不深入细节
三个图结果还是很明显的,就不细说了
7. git show
-
git show 查看当前head指向的commit上的详细修改信息
-
git show [某一次commit的id] 查看某一次commit的详细信息
-
git show [某一次commit的id] [某个目录下的某个文件]
8. git diff
-
git diff 查看未提交的内容和暂存区的内容差异
我们继续修改test.js先添加上console.log(6),并且git add . 添加到缓存区,然后我们又在工作区将6改成7,通过git diff查看下效果
-
git diff --staged 显示暂存区和上一次提交之间的不同。
-
git diff HEAD 对比工作目录和上一次提交的差异
三个图还是挺直观的,不同的场景使用这三者中的一个
9. git fetch
- git fetch <远程主机名> <远程分支名>:<本地分支名> 创建本地分支名并将远程仓库仓库某个远程分支拉到本地这个分支上
然后我们可以在本地选择哪个分支去合并这个代码
10.git pull
- git pull <远程主机名> <远程分支名>:<本地分支名> 将远程仓库分支上的代码拉下来并merge到当前本地分支上
如果本地分支和远程分支名相同,可以直接写一个,例如我们常规操作git pull origin master。
git pull origin master
==============
git fetch origin master
git merge orgin/master
以上两个操作是等价的