git一共分四块:工作区(代码),暂存区,本地版本库,远程版本库
git init -->git初始化
git add . -->git从工作区添加到暂存区
git commit -m '提交描述信息'-->git从暂存区提交到本地库
git remote add origin 远程URI -->git本地仓库和远程仓库关联
git push -u origin master -->git把本地库的内容提交到远程库(第一push记得加-u,后面就用了)
git status -->git查看当前是否有更新内容
git log -->git查看已经提交过的日志
git log pretty=oneline -->git查看已经提交过的日志,一行显示
git reflog -->git查看以前执行过的记录(主要用来查看Commit_id)
git reset --hard commit_id (至少四位:用git log或者用git reflog查看)
-->git用来执行版本回退的
git checkout -- ./文件名<记得要是路径+文件名>(.:代表所有文件,如果你只需要某个文件中的内容回退就写文件名)-->这个命令代表的是工作区(代码)中的内容回退。
git rm 文件 -->git删除文件
git checkout -- ./文件名 -->git也可以用来把误删除的文件回退
git clone 远程URI -->克隆项目到本地
git branch -->查看分支
git branch <name:分支名>-->创建分支
git checkout <name:分支名>-->切换分支
git checkout -b <name:分支名>-->创建且切换分支
git merge <name> -->合并分支到当前分支
git branch -d <name> -->删除分支
git tag <name> -->用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m '标签描述信息' -->可以指定标签信息;
git tag -s <tagname> -m '标签描述信息' -->可以用PGP签名标签;
git tag -->可以查看所有标签。
git push origin <tagname> -->可以推送一个本地标签;
git push origin --tags -->可以推送全部未推送过的本地标签;
git tag -d <tagname> -->可以删除一个本地标签;
git push origin :refs/tags/<tagname> -->可以删除一个远程标签。
特例1:如果想合并某一个分支的某几个文件:
场景:当前分支是test_xiang,想从test_xiangping分支合并Test.java文件就可以了
1.创建一个test_xiang的临时分支:
git checkout -b test_xiang_temp
2.把test_xiangping分支上的Test.java合并到test_xiang分支上
git checkout --patch test_xiangping Test.java
或
git checkout test_xiangping Test.java
3.把test_xiang_temp合并到test_xiang上
git merg test_xiang_temp
4.测试test_xiang如果没有问题,就删除test_xiang_temp分支
git branch -d test_xiang_temp
特例2:如果想合并某一个分支中的一个commit
命令:git cherry-pick 合并某个commit
git cherry-pick 命令能把某一个分支的一个或多个commit合并。
就是对已经存在的commit 进行 再次提交--如下:
命令:git cherry-pick <commit id>
查询git的历史版本:
命令:git log
命令:git show commit_id
git log [<options>] [<since>..<until>] [[--] <path>...]
主要参数选项如下:
-p:按补丁显示每个更新间的差异
--stat:显示每次更新的修改文件的统计信息
--shortstat:只显示--stat中最后的行数添加修改删除统计
--name-only:尽在已修改的提交信息后显示文件清单
--name-status:显示新增、修改和删除的文件清单
--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符
--relative-date:使用较短的相对时间显示(例如:"two weeks ago")
--graph:显示ASCII图形表示的分支合并历史
--pretty:使用其他格式显示历史提交信息
git log的结果如下:
commit 64c89137c0dbe012b47ded3423dd35f0d5b76481
Author: xiangping <xiangping@xiaoniu.com>
Date: Wed Nov 7 11:05:20 2018 +0800
其中 64c89137c0dbe012b47ded3423dd35f0d5b76481 就是我们的commit id
注意:当执行完 cherry-pick 以后,会重新提交;再次提交的哈希值和原来的不同,但标识名 一样(commit id会变)
如果想把A分支的一个commit合并到B分支,先切换到B分支
(注意:cherry-pick是本地的操作,假如你pull代码之后有人在A分支上有了新的commit,需要你先pull代码在进行cherry-pick)。
命令:git checkout B
note:把分支A的某一次提交:commit_id=64c89137c0dbe012b47ded3423dd35f0d5b76481 合并到B分支。commit_id的值可以写全,也可以只给出前面的一段,只要你提交的commit_id没有重复的就好,剩下的部分git会帮你填充。(建议最好写全)
命令:git cherry-pick 64c89137c0dbe012b4
命令:git cherry-pick 64c89137c0dbe012b47ded3423dd35f0d5b76481
----上面的命令是将A分支的一个commit_id为64c89137c0dbe012b47ded3423dd35f0d5b76481的一次提交添加到B分支
1.合并成功显示如下:
Finished one cherry-pick.
# On branch B
# Your branch is ahead of 'origin/B' by 1 commits.
2.有冲突的情况,比如和a12f48554a4adaed6718de89ad9dafba939a90b的提交冲突
Automatic cherry-pick failed. After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result with:
命令:git commit -c a12f48554a4adaed6718de89ad9dafba939a90b
解决的冲突的方法:
1)查看冲突的文件
命令:git status
both modified: com/xping/hrbt/model/Xiangping.java
2)把Xiangping文件解决冲突,然后用git add命令、再执行commit命令,提交。
可遇见性问题:
命令:git cherry-pick 999sdak233sdff594a69a33d12e22bedfae4
出现了如下的错误:fatal: bad object 999sdak233sdff594a69a33d12e22bedfae4
可能出现的原因:git cherry-pick commit_id 这个命令是一个本地操作,所以你必须保证本地有这个commit_id,所以建议再做这个操作之前都先pull一下代码。把代码拉到本地。
============================================================================
合并某一个某一个分支的commit_id命令:git rebase -i commit_id
合并某一个某一个分支的commit_id命令:git cherry-pick commit_id