title: git日常使用操作 (快速入门)
date: 2015-11-12 10:41:34
Git简介(一)——Git的历史和特点
Git是一款开源的分布式版本控制系统(Distributed Version Control System) ,诞生于2002年,由Linux之父Linus Torvalds带领Linux开源社区开发完成。初衷是用其管理Linux内核的庞大的开源代码。
Git的设计理念包括以下几点:
- 速度快
- 设计简单
- 强力支持非线性开发,允许上千分支并行开发
- 完全的分布式
- 有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)
Git简介(二)——分布式与集中式的区别
不同于大家所熟知的SVN,CC等集中式的版本控制工具,Git是一款分布式的版本控制工具。以下两幅图展示了两种工具不同的工作模式
Git简介(三)——对比数据
Git简介(四)——Git给我们带来了什么?
以下情况有遇到过吗?抓狂过,有木有?
- * 突然插入的bugfix,回退工作目录。全删全编,漫长琐碎!*
* Git stash保存所有工作内容,一条命令帮你搞定!*- * 同时开发多个特性,你敢混用一个工程么?自找麻烦!*
* Git branch多条私有分支,简单轻松。拉分支无需审批,我的地盘我做主。 *- * 查看文件的svn log,等吧
~~~ZZZzzz~~~~~ *
* Gitk 完全本地化运作,一眨眼的功夫。还有完全的分支图,爽不爽?*- * 完成了!提交!不对!加个补丁提交!以混乱示人,甘心么?*
* 提交错了怎么办,打个补丁?你out了,git amend帮你搞定,了无痕迹。*- * 最无脑debug,二分法回退版本。为什么不用呢?操作好烦!*
易* 用的bisect,指定两端:good和bad,Git帮你找。*
心动了吗?让我们开始吧。
Git基础知识(二)——基本操作模式
Git基础知识(三)——Snapshot
Git基本日常操作 (重点)
- * 克隆中心库到本地 *
* $ git clone 中心库名称地址 本地工作目录名称 *
$ git clone http://git.xxxx.net/xxxx/tools.git -b master mylocal_tools_path
- * 增加文件提交入库*
$ echo "Hi," >> readme.txt
$ git add readme.txt
$ git commit -m "Just a test for add readme.txt"
- * 修改文件提交入库 *
$ echo "wwwww ! " >> readme.txt
$ git add readme.txt
$ git commit -m "Just a test for modify readme.txt"
- * 删除文件提交入库 (直接使用rm filename 是没有用的,必须要用git rm 存入git缓存中)*
$ git rm readme.txt
$ git commit -m "Just a test for remove readme.txt"
- * Push提交到中心库中及创建删除中心库分支 *
- * Push提交到中心库 *
$ git push
注:默认后面的参数都省略了,以你下载服务器的master分支为例,上面的命令等于:
$ git push origin HEAD:master
- * Push 提交到其他分支 *
$ git push origin HEAD:other_dev_branch
- * 创建中心库分支 *
$ git push origin HEAD:my_new_branch
- * 删除中心库分支 *
$ git push origin :my_new_branch
- * 强制覆盖中心库分支(不要轻易使用 - -!) *
$ git push origin HEAD:other_dev_branch -f
- * 修复上一次提交的内容或提交信息 *
$ git add your_patch
$ git commit --amend
- * 取消本地文件的修改,回复已删除掉的文件 *
$ git checkout 文件名
- * 取消/回退已缓存的修改 *
$ git reset --hard HEAD 文件名
注:此操作将回退本地此文件到当前最新提交节点,包括本地内容
$ git reset HEAD 文件名
注:此操作将修改的文件从缓冲区内删除,此文件的修改还在本地环境中
- * 清除本地所有已修改的文件和所有垃圾文件 *
$ git reset --hard HEAD;git clean -fd
注:前面是清除所有git修改包括git缓存中的及status绿色的,git clean -fd 是清除所有未进入git 库的垃圾文件目录
- * 查看仓库状态 *
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
注:查看本地库中所有文件的状态,包括未受控的,已修改,已缓存。冲突文件的状态也表现为已修改的。
- * 比较文件差异 *
- * 比较当前修改的所有文件与库里的差异*
* git diff 默认是对比本地目录的修改和git缓存中的自己去对比,缓存中没有修改那么默认就是和代码库里面作对比 *
* git diff –cached 是对比缓存的修改和git代码库中去对比 *
$ git diff
diff --git a/readme.txt b/readme.txt
index 2b4b449..3633e9a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
+Just a test
Hi,wwwww
!
- * 比较某文件在俩次Commit提交之间的差异 *
$ git diff OldcommitID NewcommitID 文件名
注:不加文件名及对比所有变动的文件
- * 比较某文件TAG_1.0与TAG_2.0有哪些差异修改 *
$ git diff TAG_1.0 TAG_2.0 文件名
注:不加文件名及对比所有变动的文件
- * 查看log *
- * 普通查看 *
$ git log
commit dd49031a9eaf3f4ecfc89685b592db80d44a1639
Author: dongwuming <dongwuming@wwwww.com>
Date: Wed Nov 11 16:58:19 2015 +0800
Hi,wwwww !
注:git reflog 显示本地所有的提交历史log记录包含已删除回退的
- * Log单行显示查看 *
$ git log --oneline
c254c21 Modify 使用说明.md for Update by gitlab HOOKS
dccf161 Update QA blog
2c7d1ae Merge branch 'master' of http://10.1.22.7/QA/QA_blog
7fd0018 Mac使用小常识
52764c8 Modify 使用说明
6cd53a5 Add hello-world.md
- * 显示每个提交修改了哪些文件 *
$ git log --name-status
commit 6cd53a5a1a31e06ba6daa7f493af4ef68c1946f9
Author: dongwuming <dongwuming@wwwww.com>
Date: Thu Nov 5 18:54:17 2015 +0800
Add hello-world.md
A source/_posts/hello-world.md
- * 显示每个提交修改了哪些文件及内容 *
$ git log -p
commit dd49031a9eaf3f4ecfc89685b592db80d44a1639
Author: dongwuming <dongwuming@wwwww.com>
Date: Wed Nov 11 16:58:19 2015 +0800
Hi,wwwww !
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..2b4b449
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1 @@
+Hi,wwwww
!
- * 在log中每个提交后面显示对应的TAG名 branch名 *
$ git log --decorate
commit dd49031a9eaf3f4ecfc89685b592db80d44a1639 (HEAD, tag: TAG_2.0, master)
- * 查看本地分支/查看当前库下的所有分支及本地和远端库的分支 *
$ git branch
* master
$ git branch -a
* master
remotes/origin/master
- * 新建本地分支 *
$ git branch 新建分知名 commitID/TAG/分支名
$ git checkout -b 新建分知名 commitID/TAG/分支名 (建议都使用这种方便的方法创建)
- * 删除本地分支 *
git branch -D 分知名
注:git branch -d 只可以删除与当前分支同源或Merged过的,所有尽量使用-D就可以啦
- * 分支合并 *
$ git merge 分知名
注:此操作是将“分支名”指示的分支合并到当前所在的分支,所以合并前必须切换到目标分支。
- * 解决冲突 (重要) *
- 合并分支,或合并库上的更新到本地均会产生冲突。Git的冲突产生是由于同一文件的同一行内容不同,具体如下:
gitmergetestbranch或者gitpull时出现冲突:Auto−mergingreadme.txtCONFLICT(content):Mergeconflictinreadme.txtAutomaticmergefailed;fixconflictsandthencommittheresult. git status
On branch master
You have unmerged paths.
(fix conflicts and run “git commit”)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
$ vi readme.txt
<<<<<<< HEAD
Hi,World !
=======
Hello,wwwww!
>>>>>>> test_branch
注:<<<<<<< HEAD到========之间是当前分支的修改,=======到>>>>>>> test_branch是合入的test_branch分支上的修改
判断保留哪些内容后删除冲突标识 <<<<<<< HEAD 、======== 、>>>>>>> test_branch 后:
$ git add readme.txt
$ git commit
- * 暂存本地修改 *
存入暂存区:
$ git stash
取出:
$ git stash pop
- * 变换基线base操作 *
$ git rebase 基线分支 换基分支
A---B---C 换基分支
/
D---E---F---G 目标分支
A'--B'--C' 换基分支
/
D---E---F---G 基线分支
- * 忽略规则 *
在git仓工作的根目录下面创建.gitignore文件,文件内容如下实例,同样.gitignore文件也可以上传的库上,这样每次下载都可以记录忽略规则,如果将某个已经忽略的文件添加,使用$ git add –f 文件名即可。
*.so #忽略所有.so结尾的文件
!lib.so #但lib.so 除外
/TTT #忽略代码库根目录下TTT文件,不包括 test/TTT
TEST/ #忽略TEST目录下的所有文件
build/*.jar #忽略build目录下的所有文件,但是不包括build/lib/test.jar
- * GUI图形化操作 *
添加、修改、删除文件时,可以直接通过“git gui”命令,
调出图形界面,通过“Stage Changed”缓存文件(新添加
的文件只能通过git add 命令缓存),在提交信息处输入“提
交信息”,然后通过“Commit”提交。