git日常开发使用的指令整理
aermin opened this issue · 0 comments
日常git命令记录
每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。
git log
:查看git历史记录
git log --graph
:看分支合并图
git log --pretty=oneline
: 查看精简的git历史记录
在Git中,用HEAD
表示当前分支&版本,即图中的master
,commit 7b035146e7db9086b9e0973ba1de6f13a99721f1
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
git reset --hard HEAD^
:回退到上一个版本
git reset --hard {commit id}
: 本地回滚,回到某个版本,你让HEAD指向哪个版本号,你就把当前版本定位在哪。
git push -u origin master -f
: 远程回滚方法之一,可能会因为权限问题报错。同时也谨慎操作,备份预备。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅改变HEAD从指向。
git reflog
: 记录你最近的每一次命令。可解决想恢复到新版本却找不到新版本的commit id时的问题,重新查明版本号
工作区
:在电脑里能看到的目录,比如文件夹就是一个工作区
版本库(Repository)
: 工作区有一个隐藏目录.git,这个是Git的版本库,里面存了很多东西,包括叫stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
把文件往Git版本库里添加的过程:
1.用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
2.用git commit
提交更改,实际上就是把暂存区的所有内容
(可以是多次add的)提交到当前分支。
git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
git diff HEAD -- readme.txt
: 可以查看工作区和版本库里面readme.txt最新版本的区别
git checkout -- readme.txt
: 把readme.txt文件在工作区的修改全部撤销,也就是add前的修改
git reset HEAD <file>
: 可以把暂存区的修改撤销掉(unstage),也就是已经add后的修改
git branch
: 查看分支
git branch <name>
: 创建分支
git checkout <name>
: 切换分支
git checkout -b <name>
: 创建+切换分支
git merge <name>
: 合并某分支到当前分支(Fast forward模式,删除分支后,会丢掉分支信息)
git merge --no-ff -m "merge with no-ff" dev
: 禁用Fast forward,在merge时生成一个新的commit,即可从从分支历史上看出分支信息
git branch -d <name>
: 删除本地仓库分支
git branch -D <name>
: 强行删除本地仓库分支
git push origin -d <name>
: 删除远程仓库分支
git checkout .
: 本地所有修改的。没有的提交的,都返回到原来的状态
git remote -v
: 查看更详细的远程库信息,如果没有推送权限,就看不到push的地址。
场景
场景 : add 完修改到储存区后 取消撤销修改
- 版本回退 -> git reset --hard 版本号
- 绿字变红字(撤销add) -> git reset HEAD
- 红字变无 (撤销没add修改) -> git checkout -- 文件 撤销该文件修改 || git checkout . 撤销全部修改
clone 远程仓库到本地后只能看到master分支
git checkout -b dev origin/dev
:创建远程origin的dev分支到本地,这样,本地才有了dev分支
git push origin master/dev
: 把该分支上的所有本地提交推送到远程库
git pull
: 如果推送失败,先抓取远程的新提交;
提交时需pull远程仓库最新代码到本地
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接
git branch --set-upstream-to=origin/<branch> dev
: 指定dev和origin/dev的链接:
git remote add origin https://github.com/aermin/react-scaffold.git
: 本地仓库链接远程仓库
git branch -m oldName newName
: 重命名本地分支
git commit --amend
: 合并缓存的修改和上一次的提交
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交
git add --all
:把所有文件修改及增删添加到暂存区
git stash
: 把当前工作现场贮藏起来,你的变更都保存在栈上
git stash list
: 查看现有的stash
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on dev: c264051 Revert "added file_size"
git stash apply stash@{1}
: 如果你想应用更早的储藏,你可以通过名字指定它。
如果你不指明,Git 默认使用最近的储藏并尝试应用它,这里差点吓尿我了,我在A banch git stash,然后切到B branch,也 git stash。接着切回A banch,执行git stash pop,发现pop的是B banch stash的内容(以为数据被覆盖而丢了),也就是stash是无论你在哪个branch都会覆盖的,默认显示所有branch中最新的stash。
git stash pop
: 复现之前储存起来的工作现场
也就是当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
这边是因为工作区和暂存区是共用的,在各个分支里都可以看到没被stash的文件,也就是比如:在dev分支,创建一个新文件test6.txt。并add它,让它stage。这时切回master分支,你会看到这个test6.txt居然也在master分支里。但它实际上是属于dev分支的。而如果用stash代替add到stage,则master分支,test6.txt就消失了。
在工作区和暂存区的文件都可以stash,pop之后都会出现在工作区。
合并最近两条commit
git reset --soft "HEAD^"
git commit --amend
git cherry-pick
: 其含义就是从众多的提交中选出一个提交应用在当前的工作分支中
当加一条commit却发现应该还有遗漏的修改属于这条commit,又不想重新加一条新的commit怎么办?
可以编辑补充遗漏的部分,然后把修改添加到缓存区:git add .
,然后合并缓存区的修改到上一次commit上:git commit --amend
。
git merge 和 git rebase ,当你在本地feature开发时,原repo的master上你的同事在此期间提交了新的commit,此时如果切回master然后pull新代码,然后切回feature,merge master,会将提交历史拷贝了一遍
用rebase解决这个问题:
git rebase master
git push origin --delete myFeature
(如果之前已将commit push到 origin了,需要先删除,不然会拒绝你push,需要先pull,而pull就是fetch+merge,那rebase就没意义了)
git push origin myFeature
新手营
前提:mac 环境下
打开Terminal(终端)
创建 testgit
文件夹
mkdir testgit
进入testgit
文件夹
cd testgit
初始化git仓库
git init
此时输入查看目录下有哪些文件的命令ls
,会发现一个文件都没有,看不到.git
文件
应该用命令ls -ah
,即可看见隐藏的.git
文件
创建并编辑一个文件
vim test.txt
点击 i
键即可开始编辑,输入点东西,然后shift
键+:
,然后输入wq
(w是write写入,q是quit退出),回车。
此时输入ls
,即可看到生成的文件test.txt
添加文件到暂存区
git add test.txt (或者git add . || git add -all 这两个命令在git第二版貌似没差了)
提交暂存区到仓库区
git commit -m "editor and add a test file"
之后再次编辑test.txt
vim test.txt
这次可看见修改的状态,显示有变更的文件
git status
未完待续.....