博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Git 使用技巧
阅读量:6849 次
发布时间:2019-06-26

本文共 2767 字,大约阅读时间需要 9 分钟。

储藏修改

git stash

当你在某个分支进行修改但还没完成所有修改,这时想切换到其他分支上进行一些工作,而你又不想提交进行了一半的工作,那就可以使用 git stash 命令。

下次想切换回这个分支继续前面的工作时,用 git stash pop 把储藏的内容取出即可。

  • 帮助理解
    git stash 会把内容推到栈上,而 git stash pop 将内容从栈上推出。所以无论进行几次的 git stash,取出内容时都遵循“先进后出”的原则哈。

多次提交合成一次

git commit --amend

git commit --amend最常见的用法是上次提交信息写错,或提交文件多了或漏了之时,重新提交覆盖上一次提交。

其实它还有一个用法,就是用来合并提交。例如上次提交的修改并不完全,再作修改之后可以用该命令把本次提交与上次提交合并在一起。

git reset

在需要回滚一次或多次提交时,可以用git reset。由于该命令比较危险,建议用于已经把最新提交推到远程仓库上的本地分支。

  • git reset HEAD [filename]

把已在暂时区的文件取消,恢复到已修改未暂存状态。

  • git reset HEAD~[n]

git reset后面可带参数HEAD~[n](n >= 1)。表示回退到n个提交之前。同时,它也可以用来合并提交。下面的写法与git commit --amend结果是一样的。

git reset HEAD~1git commit复制代码

下面的用法则是合并了多次提交

git reset HEAD~2git commit复制代码
  • git reset [version]

git reset后面也可以带版本号,直接回退到指定版本。

  • git reset的三种参数

    1. 使用参数--hard,如git reset --hard [version]会执行以下操作:
      1. 替换引用的指向。引用指向新的提交ID。
      2. 替换暂存区。替换后,暂存区的内容和引用指向的目录树一致。
      3. 替换工作区。替换后,工作区的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同。
    2. 使用参数--soft,如 git reset --soft [version]会执行上述的操作a。即只更改引用的指向,不改变暂存区和工作区。
    3. 使用参数--mixed或者不使用参数(默认为--mixed),如 git reset [version]会执行上述的操作a和b。即更改引用的指向及重置暂存区,但是不改变工作区。

不快速合并

git merge --no-ff

--no-ff是不快速合并的意思

与git merge的区别

git merge的结果:

被merge的分支和当前分支在图形上并为一条线,被merge的提交点逐一合并到当前分支。

image

git merge --no-ff的结果:

被merge的分支和当前分支不在一条线上,被merge的提交点还在原来的分支上,同时在当前分支上产生一个合并点。这样在回滚时非常方便,版本树也很清晰。

image

变基

git rebase

git rebase一般解释为变基,也有解释为衍合,个人觉得变基比较容易理解。

与git merge的区别

git merge是把两个分支的代码合并到一起,其实git rebase也是相同的作用,但是表现上是两种不同的形式。

例如现在 dev 提交了一次,master 在此之后也提交了一次,两个分支的状态如下:

image

  • 提交点顺序

可以看出git merge后,无论加不加--no-ff参数,提交点的顺序都和提交的时间顺序相同,即 master 的提交在 dev 之后,如图:

image

git rebase后,顺序就变成被rebase的分支(master)所有提交都在前面,进行rebase的分支(dev)提交都在被rebase的分支之后,在同一分支上的提交点仍按时间顺序排列,如图:

image

  • 变基

从上面的图可以看出,dev 在rebase master 后,分支发生了变化,原本是两个分支,rebase的结果看起来是: dev 是基于 master 的分支,且产生了一些新提交。

一般来说,rebase后的 dev 和远程的origin/dev会发生分离,在命令行界面中会提示:

Your branch and 'origin/dev' have diverged,and have 1 and 1 different commits each, respectively.  (use "git pull" to merge the remote branch into yours)复制代码

这时需要用git push -f强制推送,覆盖远程分支。若使用了提示中的git pull,结果会变成合并,并产生一个合并提交点。

注:慎用git push -f!

git pull --rebase

注意git pull时请加上--rebase,理由下面会说。

与git pull的区别

在一般情况下,加与不加--rebase是没有区别的。然而,结合上面说的git rebase功能,可以知道某个分支可能与其远程分支发生分离,而当你pull时,你的本地分支还是和原来的远程分支一样,这时如果使用git pull,则会变成你的本地分支和远程分支合并,正确的做法是git pull --rebase,才会拉取到最新的分支。

所以推荐在任何时候pull远程分支,最好加上--rebase参数。

查看本地操作记录

git reflog

查看提交记录的命令是git log,而git reflog的功能是查看本地操作记录,如此一来可以看到本地的commit, merge, rebase等操作记录。

6fe46ab HEAD@{0}: rebase finished: returning to refs/heads/dev6fe46ab HEAD@{1}: rebase: dev modify a2c92bcb HEAD@{2}: rebase: checkout master9b26f5d HEAD@{3}: reset: moving to 9b26f5db1e8597b884c45114fbbff36c440da2745531fc0 HEAD@{4}: merge master: Merge made by the 'recursive' strategy.9b26f5d HEAD@{5}: checkout: moving from master to dev复制代码

Git工具推荐

  • SourceTree
  • GUI Clients

转载地址:http://pgrul.baihongyu.com/

你可能感兴趣的文章
jetspeed教程翻译——jetexpress项目门户的自定义
查看>>
华为usg6380 ssh 配置方法
查看>>
抽象工厂模式(Abstract Factory)
查看>>
zval_dtor与zval_ptr_dtor的区别
查看>>
Cisco route-map 源地址路由配置
查看>>
11月6日记
查看>>
[李景山php]每天TP5-20170109|thinkphp5-Model.php-2
查看>>
在windows(64)下安装php开发环境wamp+yaf框架+phpstorm以及TortoiseGit
查看>>
淘宝的IP地址库
查看>>
ORACLE 建库过程总结
查看>>
Comparable与Comparator的区别(转载)
查看>>
我的友情链接
查看>>
window下从硬盘安装ubuntu双系统
查看>>
socket服务器与客户机的互动
查看>>
三种方法实现选项卡效果
查看>>
API网关(API Gateway)
查看>>
Zookeeper集群搭建和简单使用
查看>>
IntelliJ IDEA快捷键
查看>>
Xmanager 连接 AIX 系统
查看>>
java的锁机制
查看>>