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