Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
aermin opened this issue Jul 5, 2018 · 0 comments
Open

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

aermin opened this issue Jul 5, 2018 · 0 comments
Labels

Comments

@aermin
Copy link
Owner

aermin commented Jul 5, 2018

日常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教程
本地回滚,远程回滚

@aermin aermin changed the title git命令使用记录 git学习整理 Jul 9, 2018
@aermin aermin changed the title git学习整理 git整理 Jul 9, 2018
@aermin aermin changed the title git整理 git日常开发使用的指令整理 Sep 19, 2018
@aermin aermin added the 工具 label Oct 27, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant