1 git diff
git @@ -2,3 +2,4 @@
•-开头的行,只出现在源文件中的行
•+开头的行,只出现在目标文件中的行
•空格开头的行,是源文件和目标文件中都出现的行
•差异按照差异小结进行组织,每个差异小结的第一行都是定位语句,由@@开头,@@结尾。
-2,3 +2,4
在源文件( a/LICENSE)第二行开始的三行, 和目标文件(b/LICENSE)第二行开始的四行不同。
2 版本库
2.1 基本目录
(1)工作区
在电脑里能看到的目录, learngit文件夹就是一个工作区
(2)版本库(repository)
工作区有一个隐藏目录.git(不是工作区),是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD。
(3)暂存区(staging area)
暂存区是Git非常重要的概念,弄明白了暂存区,就弄明白了Git的很多操作到底干了什么。
2.2 添加文件到Git仓库
1.使用命令git add <file> -->git add负责把修改提交到暂存区
2.使用命令git commit -m <message> -->git commit只负责把暂存区的修改提交到
3.提交后,用git diff HEAD -- 命令可以查看工作区和版本库里面最新版本的区别
2.3 常用操作
git checkout -- <file>... to discard changes in working directory
git reset HEAD <file> 负责把暂存区(stage)中<file>重新放到工作区
git reset HEAD 负责把暂存区(stage)中所有文件重新放到工作区
git reset --hard <commit number> 回退到相应的commit,之前的修改全部丢失(慎用)
git log可以查看提交历史,以便确定要回退到哪个版本。
git reflog查看命令历史,以便确定要回到未来的哪个版本。
2.4 git revert
reset是回朔到指定的commit版本,指定的commit版本之后的操作commit都重置了.
revert是删除指定的commit操作的内容,指定的commit之前和之后commit操作都不受影响,与此同时这个操作也会作为一个commit进行提交.
当前的commit如下
(1)reset和revert用法比较
reset: 当前commit为HEAD,然后每一个commit加一得到要撤销的commit 为HEAD~4.
revert: git revert
+ 完整的commit或者该commit前7位即可
git revert d672cd988198d3aec6faaccf0e39ab38e2304d19 或者 git revert d672cd9
得到结果如下
(2) 连续取消几个commit id
例如取消最新的三个commit:HEAD 1-3
git revert X...Y
用法: X...Y 代表一个左开右闭区间(X,Y],不包括X,包括Y. 其中Y为起点commit,X为终点commit的下一个commit
方式一:
bash-3.2$:git revert HEAD~3...HEAD
方式二:
git revert 6a2cc3d...6a43ed0
git revert 6a2cc3dd8385004a5b9145630cb0b67498155c6b...6a43ed02f5831c9b91df9ae0dbfb9561d1ec2bb2
3 分支操作
3.1 常用操作命令
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
3.2 解决冲突
cdlab@cdlab-MS-7A95:~/github/learngit$ git merge feature1
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
cdlab@cdlab-MS-7A95:~/github/learngit$ cat README.md
# learngit
hello world22222222
<<<<<<< HEAD
hello & world22222222
=======
hello and world22222222
>>>>>>> feature1
将"<<<<<<< HEAD", "=======" 和 ">>>>>>> feature1"删除.保留 "hello & world22222222" 或者"hello and world22222222", 然后再add和commit.
cdlab@cdlab-MS-7A95:~/github/learngit$ git add .
cdlab@cdlab-MS-7A95:~/github/learngit$ git commit -m "merge"
[master a9ea3b9] hello
cdlab@cdlab-MS-7A95:~/github/learngit$ git branch
feature1
* master
cdlab@cdlab-MS-7A95:~/github/learngit$ git merge feature1
Already up to date.
4 分支策略
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作.
4.1 git stash 常用操作
(1)git stash save "save message"
(2)git stash list
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply : 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop : 命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash命令:git stash pop stash@{$num} ,比如应用并删除第二个: git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :删除所有缓存的stash
4.2 远程库
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
•查看远程库信息,使用git remote -v;
•本地新建的分支如果不推送到远程,对其他人就是不可见的;
•从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
•在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
•建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
•从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
5 分支命令总结
查看分支
git branch
创建分支
git branch 分支名
切换分支
git checkout 分支名
合并分支(可能产生冲突)
git merge 要合并的分支
note:切换分支再合并
删除本地分支
git branch -d 分支名称
删除远程分支
git push origin --delete 分支名 (eric_fix_conosle_input)
拉取远程库所有的分支
git fetch --all
创建空白分支
(1)使用如下命令(--orphan)新建空白分支, 然后用git status 查看,会发现所有文件都在暂存区.
git checkout --orphan blank_branch
(2)使用如下命令删除暂存区全部内容
git rm -rf .
(3)提交文件到分支 ( 因为没有提交记录,分支是无法看见的.)
echo 'blank test' >> README.md
git add README.md
git commit -m 'blank branch'
(4)将分支push到远程repository
git push origin blank_branch
6 远程代码管理
添加远程连接(别名)
git remote add origin 地址
推送代码
git push origin 分支名(dev)
下载代码
git clone 地址
拉取代码
git pull origin 分支名(dev)
等价于
git fetch origin dev
git merge origin/dev
保持代码整洁(变基)
git rebase 分支
记录图形展示
git log --graph --pretty-format:"%h %s"
7 Beyond Compare 使用(解决冲突)
在git中配置
git config --local merge.tool bc3(软件别名)
git config --local mergetool.path '/usr/local/bin/bcomp'
git config --local mergetool.keepBackup false
应用beyond compare 解决冲突
git mergetool
8 git 免密登录
URL中体现
原来的地址:https://github.com/knowledging/learngit.git
修改的地址:https://用户名:密码@github.com/knowledging/learngit.git
在.git/config文件中修改
git remote add origin https://用户名:密码@github.com/knowledging/learngit.git
采用SSH登录
9 GIT tag
- 打tag: git tag -a 版本号 -m “描述信息”
- 推送所有的tag: git push origin --tags
- 推送单个tag: git push origin 版本号
- 删除tag: git tag -d 版本号
- git checkout “版本号”
10 打patch
场景从一个repository中将commit打成patch添加到另一个repository中
生成patch
git format-patch [commit id1]^..[commit id2] //将包含commit id1 至 commit id2的patch打成包,将生成[000x-commitid1.patch ~ 00x-commitid2.patch]
git format-patch [commit id 1]..[commit id 2] //将不包含commit id 1 至 commit id 2的patch打成,将生成(000x-commitid1.patch ~ 00x-commitid2.patch]
git format-patch -1 [commit id] //指定commit id生成patch,将生成000x-commitid.patch
git diff [commit id1]^..[commit id2] > xxx_diff.patch //将包含commit id1 至 commit id2的patch生成一个xxx_diff.patch, 用git apply命令打patch
打patch
- 需要注意下patch中的路径
git apply 000-xxx.patch //允许将自己的信息添加
git am 000x-xxx.patch //原封不动的打上相应的信息