再探git

在这里插入图片描述

–cached == --staged
not staged:文件已经存在暂存区,工作区文件修改了但还没add到Stage
not tracked:工作区新建的文件,从未添加到Stage。

git status : 查看暂存区和本地仓库的状态。

git ls-files : 显示暂存区的文件,git commit/push之后,记录仍在。
–cached : 显示暂存区里的文件(默认)
–deleted:显示从暂存区删除的文件(git rm file :从Stage中删除)
–modified:显示在工作区被修改了但还未add到暂存区的文件
待探索

git diff 比较工作区和最后一次commit共同的文件中的diff
–cached :比较暂存区与最后一次commit所有文件中的diff
git diff branch1 branch2:比较两分支
git diff HEAD~1 HEAD~2:比较两次提交版本之间的diff。
所有的比较都是比较的本地

git reset : 切换版本库。HEAD指向版本库中最新提交的版本,可以用git log --oneline显示提交的历史。切换版本裤就是改变HEAD只真的指向,HEAD指向当前最新版本,HEAD~1是最新的上一版本。

//第一列显示 commit id(也叫版本号),第二列时commit时的注释
B000000330124A:test liuchunhui02$ git log --oneline
051772c (HEAD -> master, origin/master, origin/HEAD) refresh all files
9087502 2.txt
a4feb93 1.txt
7181ec5 Init commit

git reset 由–mixed(默认), --soft, --hard三种版本切换时的改变程度。
git reset --选项 HEAD~x
–soft:只撤销最新commit,切换到HEAD~x,不改变暂存区内容,再次commit时就会回到当前状态。
–mixed:切换版本,恢复暂存区文件。
–hard:切换版本,恢复暂存区和工作区文件。(慎重)

利用git reset和reflog在版本中来回切换

因为git reset 回退版本后git log就看不到该版本之后的版本,所以使用git reflog查看改动历史

//第一列commit id,第二列版本变化情况,第三列是commit注释或者让版本切换的注释
B000000330124A:test liuchunhui02$ git reset HEAD~2 --hard
HEAD is now at a4feb93 1.txt
B000000330124A:test liuchunhui02$ git reflog
a4feb93 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2
051772c (origin/master, origin/HEAD) HEAD@{1}: reset: moving to 051772c
a4feb93 (HEAD -> master) HEAD@{2}: reset: moving to HEAD~1
9087502 HEAD@{3}: reset: moving to HEAD~1
051772c (origin/master, origin/HEAD) HEAD@{4}: reset: moving to 051772c
051772c (origin/master, origin/HEAD) HEAD@{5}: reset: moving to 051772c
a4feb93 (HEAD -> master) HEAD@{6}: reset: moving to HEAD~2
051772c (origin/master, origin/HEAD) HEAD@{7}: reset: moving to 051772c
a4feb93 (HEAD -> master) HEAD@{8}: reset: moving to HEAD~2
051772c (origin/master, origin/HEAD) HEAD@{9}: reset: moving to 051772c
a4feb93 (HEAD -> master) HEAD@{10}: reset: moving to HEAD~2
051772c (origin/master, origin/HEAD) HEAD@{11}: commit: refresh all files
9087502 HEAD@{12}: reset: moving to HEAD
9087502 HEAD@{13}: commit: 2.txt
a4feb93 (HEAD -> master) HEAD@{14}: reset: moving to HEAD
a4feb93 (HEAD -> master) HEAD@{15}: commit: 1.txt
7181ec5 HEAD@{16}: clone: from ssh://github/xxx/test

可以找到最新的提交的id,051772c (origin/master, origin/HEAD) HEAD@{11}: commit: refresh all files,于是

git reset 051772c --hard。

版本回退

必须未提交到远程的前提下。

工作区修改错了文件,想恢复到之前没修改的状态,就需要版本回退。根据git的阶段分为3种情况:

  1. 还未add到暂存区

git checkout – file :将文件从暂存区中恢复。注意git checkout – (区别于git checkout 建分支)只能恢复暂存区中有的文件,如果工作区里是新建的还未添加到过暂存区,那么就恢复不了。

  1. git add到暂存区但还未commit

git reset HEAD file //将最新分支恢复到暂存区,mixed方式
git checkout – file //从暂存区恢复到工作区

  1. 已经提交

git reset --hard HEAD~x //恢复全部文件
git reset HEAD~x file //单个文件
git checkout – file

合入远程分支

比较好的开发习惯是:开发时从远端拉取分支,如master,然后从该分支上拉出一个dev分支,平时在dev分支上提交、合并,保持本地master的整洁,本地master纯粹为了追踪远端的。然时,每开发几个小功能就commit一次,多commit这样每次commit的diff就会小,版本回退起来更方便。

git merge : 会使提交线变得网状复杂。
git rebase -i HEAD~x : 合并该分支上前x个提交(较少解冲突次数)
步骤:
git checkout master
git pull //切回master分支,同步远端
git checkout dev
git rebase -i HEAD~3 //合并dev分支上前3个commit
git rebase master //合并master到当前分支。
出现冲突后,手动vim解冲突,解完当前文件后git add file, 然后git rebase --continue解下一个冲突文件。
git push origin HEAD:refs/for/xxx

同步远端代码

git pull = git fetch + git merge,尽量使用git fetch, git merge而不是git pull来拉代码,除非不会出现冲突。

git fetch origin master:tmp //将远端master拉取到本地tmp分支
git merge tmp //在当前分支上合并tmp分支
git branch -d tmp //删除tmp分支

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值