将工作区的代码提交到暂存区,再提交到当前的本地分支
# 将代码从工作区提交到暂存区
git add index.html
# 将暂存区的代码提交到当前的本地分支
git commit -m "提交了修改"
工作区 ----- add
------> 暂存区 ---- commit
----> 当前本地分支
查看修改的地方:
git diff index.html
(工作区和暂存区diff)或者git diff HEAD -- index.html
(工作区和版本库里面最新版本diff)
查看暂存区的文件状态:git status
版本回退
- 回退到上一个版本
git reset --hard HEAD^
在git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD^...上100个版本就是HEAD~100
- 回退到某个版本
# 1094a是版本号,可以不写全
git reset --hard 1094a
查看版本号:
git log
查看版本号(简易显示):git log --pretty=oneline
查看历史出现过的所有版本号:git reflog
第一次修改 -> git add
-> 第二次修改 -> git commit
执行git commit
后,被提交的修改只有第一次的,而没有第二次的,因为第二次的修改仍在暂存区,所以若要把第二次修改也提交,需再执行一次 git add
-> git commit
撤销修改,回到暂存区
git checkout -- readme.txt
git checkout -- readme.txt
会把readme.txt
文件在工作区的修改全部撤销,但有两种情况:
1、readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2、readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
我的理解:该命令就是将工作区的文件回退到暂存区的样子,因为第一种情况下文件修改后还没有被放到暂存区,所以暂存区和版本库里是一样的,所以第一种情况下回到版本库也是回到暂存区
抛弃暂存区的修改
修改了文件,又git add
到暂存区了,但并未commit
,这种情况下撤销缓存区:
git reset HEAD readme.txt
git reset
命令既可以回退版本,又可以撤销暂存区
撤销总结
情形:修改第一次----
add
----> 修改第二次
用git status
打印:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
抛弃缓存区,这样缓存区干净了,就回到了场景1,第二步按场景1操作。场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退
git reset --hard HEAD^
,不过前提是没有推送到远程库。
删除文件
情形:添加了新文件
test.txt
,并commit
到了git
若直接在本地rm test.txt
后,git status
会提示有文件被删除了,也就是版本库里依然有这个文件
所以要git rm
删掉,并且git commit
,这样版本库中才被删除
分支
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
克隆指定分支:git clone -b name url
Fast forward模式
合并分支,解决冲突
情形:在master上新建dev分支,切回master分支,在master上加上
A and B
,执行add
、commit
,再切到dev,在dev上加上了A & B
,然后执行add
、commit
,切回master,在master上将dev合并到当前分支git merge dev
,出现冲突
出现冲突后:
1.解决冲突,将master的两个箭头二选一,选择A and B
2.执行add
、commit
若要查看分支合并图:git log --graph
如果master上有修改,而并未add
、commit
,就切换到dev上,则master的修改也会带到dev
不使用Fast forward模式
合并分支
情形:在master分支上新建并切换到dev分支,在dev分支上做了修改并
add
、commit
,再切回到master分支,执行非快速合并git merge --no-ff -m "合并" dev
,再git log --graph
保存工作现场
情景:现在在dev分支上修改了一堆文件,突然来了一个任务,需要切到别的分支上去,而dev上的修改又不能commit,如果直接切到新的分支上,那么当前的修改也会带过去,即使add了修改文件也会把修改带过去
git stash
这个命令会把工作现场保存起来,如果用git status查看工作区,就是干净的(除非有没有被Git管理的文件,如新增的文件)
查看工作现场:git stash list
恢复现场但不删除stash:git stash apply
删除stash:git stash drop
恢复现场并删除stash:git stash pop
推送分支
#将本地的dev分支,推送到,远程origin仓库的ff分支,远程没有ff分支将创建ff
git push origin dev:ff
#将当前分支push到远程的dev上
git push origin dev
查看远程库:git remote
查看远程分支:git branch -a
将远程某个分支拉下来
#将远程的dev分支拉到本地,并新建为dev
git checkout -b dev origin/dev
如果拉取不下来,提示远程没有origin/dev,则是本地没有更新,git pull一下
push冲突
情景:我再origin/dev分支上做了修改,另一人也在origin/dev做了修改并先我一步push了上去,现在我要push的时候冲突了
#解决冲突要先pull
git pull
#执行pull后,就有提示,要先解决冲突,方法跟合并分支时遇到冲突的解决方法一样
#修改冲突后,add、commit
git add ...
git commit ...
#再push,就没问题了
git push
丢掉commit,回到commit之前的、编辑过的、待commit的状态
场景:a状态工作空间是干净的,然后编辑某个文件,到了b状态,再add、commit,到了c状态,现在发现多commit了一个文件,想丢掉commit,回到之前编辑的状态b
-
git log
,找到上一个commit的id,也就是a状态的id,从上往下第二个,叫huifu_id
git reset huifu_id
将远程仓库的多个commit合成一个
#先将本地的多个commit合成一个,40111daac是最早提交的一个id
git reset --soft 40111daac
git commit --amend
#强制push到远程
git push origin tangchao-essensial -f
将文件回退到某个版本
场景:想将file.js文件回退到某个commit
git checkout commit_id file.js
arc
arc land 分支(不写默认当前分支) --onto develop-test
: 将当前分支合到另一个分支
Your branch and 'origin/master' have diverged, and have 1 and 1 different commits each, respectively
当我们在本地提交到远程仓库的时候,如果遇到上述问题,我们可以首先使用如下命令:
git rebase origin/master
然后使用
git pull --rebase
最后使用
git push origin master