git实用技巧

252 阅读5分钟

git是什么

是一个分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。

使用git的优缺点:

优点:

  1. 适合分布式开发,速度快、灵活。

  2. 任意两个开发者之间可以很容易的解决冲突。

  3. 离线工作。

缺点:

  1. 可参考的资料少。

  2. 学习周期相对而言比较长。

  3. 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

git下载安装

git下载地址:git-scm.com

具体如何安装网上有很多的教程

Git命令的知识点:

HEAD:当前commit

当前commit的引用,就是你本地分支当前最新的一个commit节点。可以认为commit节点在哪里,HEAD就在哪里。所以可以用HEAD是来操作当前commit。

branch:分支

  1. 创建 git branch 分支名 或者 git checkout -b 分支名 (后面这种方式创建后会自动切换到该分支)
  2. 切换 git checkout 分支名
  3. 删除 git branch -d 分支名

master:主分支(主branch)

与branch的区别

  1. 新建的仓库中的第一个commit会被master自动指向
  2. git clone的情况下,会自动切到master分支

push

  1. push是把当前的分支上传到远程仓库,并把这个branch的路径上的所有commit也一起上传
  2. push的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用gi t push origin branchName的格式,而不能只用git push;或者可以通过git config修改push.default来改变push时的行为逻辑
  3. push的时候之后上传当前分支,并不会上传HEAD;远程仓库的HEAD是一直指向默认master分支

merge

  1. merge的含义:从两个不同分支commit的位置起,把目标commit的内容应用到当前commit(HEAD所指向的commit),并生成一个新的commit;

  2. merge的适用场景:临时开发的branch用完以后,合并回原先的branch;还有就是git pull 的内部操作

  3. merge的三种特殊情况:

    1)冲突,出现的原因是当前分支和目标分支修改了同一部分内容,git无法确定应该怎么合并;应对这个问题的办法是解决冲突然后再手动commit

    2)HEAD领先于目标commit: git什么也不做,空操作

    3)HEAD落后于目标commit:fast-forward

add

  1. git add 文件名 将指定改动文件放到暂存区
  2. git add . 将工作目录下的全部改动文件放到暂存区

:新建一个文件没有add之前是存放在Untracked区,执行add后才会移到stage暂存区

看看都改了什么

  1. 查看历史中的多个 commit:log

    1)查看详细改动: git log -p

    2)查看大致改动:git log --stat

  2. 查看具体某个 commit:show

    1)要看最新 commit ,直接输入 git show ;要看指定 commit ,输入 git show commit的引用或SHA-1

    2)如果还要指定文件,在 git show 的最后加上文件名

  3. 查看未提交的内容:diff

    1)查看暂存区和上一条 commit 的区别:git diff --staged(或 --cached)

    2)查看工作目录和暂存区的区别:git diff 不加选项参数

    3)查看工作目录和上一条 commit 的区别:git diff HEAD

rebase

从提交可视化log视图中可以看到,merge之后的commit历史会出现分叉,这种分叉再汇合 的结构会让有些人觉得混乱而难以管理。如果你不希望 commit 历史出现分叉,可以用 rebase 来代替 merge

rebase 的意思是,给你的 commit 序列重新设置基础点(也就是父 commit)。展开来说就是,把你指定的 commit 以及它所在的 commit 串,以指定的目标 commit 为基础,依次重新提交一次

需要说明的是,rebase 是站在需要被 rebase 的 commit 上进行操作,这点和 merge 是不同的。

使用方式: git rebase 目标基础点

给提交打补丁

  1. 最新提交的commit有一个错误如何修复

    可以用优雅和简单的解决方法:commit -—amend来解决

    git commit --amend
    

    需要注意的有一点:commit --amend 并不是直接修改原 commit 的内容,而是生成一条新的 commit。

    如果提交的commit message不需要修改可以使用

    git commit --amend --no-edit
    
  2. 如果写错的不是最新的提交,而是倒数第二个,又该如何修复

    如果不是最新的 commit 写错,就不能用 commit --amend 来修复了,而是要用 rebase。不过需要给 rebase 也加一个参数:-i

    git rebase -i HEAD^^(目标commit);
    把它的操作指令从 `pick` 改成 `edit`,就可以退出编辑界面了
    操作完成之后用 git rebase --continue 来继续 rebase 过程。
    
    说明:在 Git 中,有两个「偏移符号」: `^` 和 `~``^` 的用法:在 `commit` 的后面加一个或多个 `^` 号,可以把 `commit` 往回偏 
    移,偏移的数量是 `^` 的数量。例如:`master^` 表示 `master` 指向的 `commit` 
    之前的那个 `commit`; `HEAD^^` 表示 `HEAD` 所指向的 `commit` 往前数两个 `commit``~` 的用法:在 `commit` 的后面加上 `~` 号和一个数,可以把 `commit` 往回偏移,
    偏移的数量是 `~` 号后面的数。例如:`HEAD~5` 表示 `HEAD` 指向的 `commit`往前数5个 `commit`

如何丢弃提交

  1. 丢弃最新的提交
git reset --hard 目标commit
reset的三种参数:
 --hard:重置位置的同时,清空工作目录的所有改动;
 --soft:重置位置的同时,保留工作目录和暂存区的内容,并把重置 `HEAD` 的位置所
 导致的新的文件差异放进暂存区。
 --mixed(默认):重置位置的同时,保留工作目录的内容,并清空暂存区。

2.提交不是最新的,如何丢弃 (还是使用rebase来丢弃)

git rebase -i HEAD^^(目标commit);
删除需要丢弃的commit,然后就可以退出编辑界面了
操作完成之后用 git rebase --continue 来继续 rebase 过程。

撤销远程仓库已经合并的提交

git revert commit

.gitignore文件

排除不想被管理的文件和目录