git是什么:
是一个分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
使用git的优缺点:
优点:
-
适合分布式开发,速度快、灵活。
-
任意两个开发者之间可以很容易的解决冲突。
-
离线工作。
缺点:
-
可参考的资料少。
-
学习周期相对而言比较长。
-
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
git下载安装
git下载地址:git-scm.com
具体如何安装网上有很多的教程
Git命令的知识点:
HEAD:当前commit
当前commit的引用,就是你本地分支当前最新的一个commit节点。可以认为commit节点在哪里,HEAD就在哪里。所以可以用HEAD是来操作当前commit。
branch:分支
- 创建 git branch 分支名 或者 git checkout -b 分支名 (后面这种方式创建后会自动切换到该分支)
- 切换 git checkout 分支名
- 删除 git branch -d 分支名
master:主分支(主branch)
与branch的区别
- 新建的仓库中的第一个commit会被master自动指向
- git clone的情况下,会自动切到master分支
push
- push是把当前的分支上传到远程仓库,并把这个branch的路径上的所有commit也一起上传
- push的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用gi t push origin branchName的格式,而不能只用git push;或者可以通过git config修改push.default来改变push时的行为逻辑
- push的时候之后上传当前分支,并不会上传HEAD;远程仓库的HEAD是一直指向默认master分支
merge
-
merge的含义:从两个不同分支commit的位置起,把目标commit的内容应用到当前commit(HEAD所指向的commit),并生成一个新的commit;
-
merge的适用场景:临时开发的branch用完以后,合并回原先的branch;还有就是git pull 的内部操作
-
merge的三种特殊情况:
1)冲突,出现的原因是当前分支和目标分支修改了同一部分内容,git无法确定应该怎么合并;应对这个问题的办法是解决冲突然后再手动commit
2)HEAD领先于目标commit: git什么也不做,空操作
3)HEAD落后于目标commit:fast-forward
add
- git add 文件名 将指定改动文件放到暂存区
- git add . 将工作目录下的全部改动文件放到暂存区
注 :新建一个文件没有add之前是存放在Untracked区,执行add后才会移到stage暂存区
看看都改了什么
-
查看历史中的多个 commit:log
1)查看详细改动: git log -p
2)查看大致改动:git log --stat
-
查看具体某个 commit:show
1)要看最新 commit ,直接输入 git show ;要看指定 commit ,输入 git show commit的引用或SHA-1
2)如果还要指定文件,在 git show 的最后加上文件名
-
查看未提交的内容: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 目标基础点
给提交打补丁
-
最新提交的commit有一个错误如何修复
可以用优雅和简单的解决方法:commit -—amend来解决
git commit --amend需要注意的有一点:commit --amend 并不是直接修改原 commit 的内容,而是生成一条新的 commit。
如果提交的commit message不需要修改可以使用
git commit --amend --no-edit -
如果写错的不是最新的提交,而是倒数第二个,又该如何修复
如果不是最新的
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`。
如何丢弃提交
- 丢弃最新的提交
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文件
排除不想被管理的文件和目录