aermin/blog

git日常开发使用的指令整理

aermin opened this issue · 0 comments

日常git命令记录

每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。

git log :查看git历史记录

git log --graph :看分支合并图

git log --pretty=oneline : 查看精简的git历史记录

image

在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。

image

把文件往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: 查看远程库的信息
image

git remote -v: 查看更详细的远程库信息,如果没有推送权限,就看不到push的地址。

image

场景

场景 : 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远程仓库最新代码到本地

image

git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接

git branch --set-upstream-to=origin/<branch> dev : 指定dev和origin/dev的链接:

image
image

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之后都会出现在工作区。

image

合并最近两条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,会将提交历史拷贝了一遍

image

image

用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第二版貌似没差了)

image

提交暂存区到仓库区

git commit  -m "editor and add  a test file"

之后再次编辑test.txt

vim test.txt

这次可看见修改的状态,显示有变更的文件

git status

未完待续.....

参考:廖雪峰老师的 git教程
本地回滚,远程回滚