昨天在同事电脑上操作了一把cherry-pick代码,发现很多功能不用,就慢慢忘记了,梳理了下流程图:
git commit --amend 前提是没push
cherry-pick [commit
git branch -r --contains cfc3521a32bd
git blame [fiel] 看具体修改
Git使用由浅入深
本地有一个项目,要使用git管理,在项目的根目录git init
修改的文件我要添加 使用git add《file》再使用git commit提交到本地
当自己写完一段程序,完成一个功能,看自己修改了哪些东西,使用git status,
如果想看具体自己修改了哪些,可以使用git diff《file》
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
·穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
·要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
·d68bbfdHEAD@{0}: commit:
·4a29787HEAD@{1}: commit:宇涵天气了
·4a0a6fdHEAD@{2}: commit:天气基本搞完了
·6c0d46aHEAD@{3}: commit:增加fragment及部分文件
·30687b6HEAD@{4}: commit:增加网络请求和响应处理的类
·f7c8d7bHEAD@{5}: commit:增加了数据库,和基本的配置
·2acbe01HEAD@{6}: clone: from https://github.com/zh2016hz/coo-weather.git
·(END)
################################
在github上创建一个仓库,然后进到本地的项目中,使用:
git clonehttps://github.com/zh2016hz/Mygittest.git
这个完成后,在你的本地项目中会多出一个文件夹:你GitHub上仓库的名字,然后打开你会发现比你仓库中多出一个文件,这里有个隐藏的文件,需要你现实自己电脑隐藏的文件,全选这几个文件,复制,粘贴到外面一层目录,会提示你.gitignore文件是隐藏的不能替换,那你就先把外层的这个文件删除了,在替换过去,替换完了把这个刚才多出来的文件夹删除就好,然后你在本地项目根目录,输入gitbranch就能看到当前在master分支上,你就可以开始了!
.gitignore文件中一般加如下就可以了:
```
/build
/.gradle
/.idea
local.properties
*.iml
*.orig
*.pyc
```
一般我们不在master分支上开发,新建一个dev分支并把新建的分支推到远端
➜GitTestgit:(master)✗git branch dev
➜GitTestgit:(master)✗git push origin
这个时候做第一次修改,然后看修改状态,提交
add是把这些文件都放到寄存区,stage然后通过commit提交到默认的master分支
第一次修改-> git add ->第二次修改-> git commit
你看,我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ gitcommit-m"remove test.txt"
[master d17efd8] remove test.txt
1file changed,1deletion(-)
deletemode100644test.txt
现在,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$git checkout -- test.txt(这个方法其实不行)
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
小结
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
################################
git下创建文件夹mkdir创建文件mkfile -n 1024 test.txt 1024是字节数
删除:
rm -rf three20
http://www.flutterstudio.com/internet/2610.html
rm删除命令。即remove的缩写,它后面有两个参数。
-r删除文件夹内的子文件夹及内容,一般情况下rm只能删除文件或者空的文件夹。
-f强制删除参数
如果需要了解rm命令的更多参数。请输入:man rm
我们创建dev分支,然后切换到dev分支:
$git checkout -b dev创建并切换到这个分支
Switchedto a new branch'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$git branch dev
$git checkout dev
Switchedto branch'dev'
然后,用git branch命令查看当前分支:
$git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:
Creating anewbranch is quick.
然后提交:
$git add readme.txt
$git commit -m"branch test"
[dev fec145a] branch test
1file changed,1insertion(+)
现在,dev分支的工作完成,我们就可以切换回master分支:
$git checkout master
Switchedto branch'master'
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
现在,我们把dev分支的工作成果合并到master分支上:
$git merge dev前提是我要切换到原始分支,这个合并后在本地,,还需要推到远端,仓库才能看到改变
Updatingd17efd8..fec145a
Fast-forward
readme.txt |1+
1file changed,1insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev分支了:
$git branch -d dev
Deletedbranch dev (was fec145a).
删除后,查看branch,就只剩下master分支了:
$git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
小结
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
########
git stash——》git stash pop
1.git config user.name xxxx:(xxxx)
2.git config user.email [email protected]:配置自己邮箱
删除分支:
git branch -d
git branch -D
以上的区别就是d会判断当前分支是否合并,如果存在没有合并的,则不允许删除,—D就是暴力删除,这个要慎用
1.1删除分支。远程:git push origin :test1
1.2删除本地: git branch -d XX
分支名没有起好,如何改名字?
三部曲:
第一:从本地该分支建一个要重新命名的新分支;
第二:将该分支推送到中央仓库;
第三:删除原来的原创分支;
如何在已有的tag上拉取分支:
1.在A项目的tag上,使用git branch test1 ,再git branch而不是git branch -a能看到新建的分支,然后在git checkout到对应的分支上,再使用git push -u origin test1提交到服务器,成功后使用git log查看提交,现在在新建的test1分支上拉代码就好了
基于某个分支拉取分支:git branch B dev
基于tag拉取分支是一样的
针对多模块使用git status需要进到各个目录下
在终端control+R可以查询使用过的命令
比如我输入:./fmanager pull则比配出./fmanager pull && cd FFProject && pod install
开发过程中,你可能会遇到有一个tag我不知道他是在那个tag上打的tag ,使用下面的方式:
查找tag所在分支
git branch -r --contains commitid
git branch -r --contains tagname
把本地tag推送到远端:git push –tags
git fetch origin tag
Workspace:工作区Index/Stage:暂存区Repository:本地仓库Remote:远程仓库
查看git的配置表#查看当前git仓库配置表
git config --list
#查看全局git仓库配置表git config --global --list
其实还有一种方式可以初始化仓库:
1.git init
关联远程仓库:git remote add [email protected]:FFProject/App_Android.git
检出仓库
git clone [email protected]:FFProject/App_Android.git
ignore忽件
将需要加版本记录的件,进ignore操作。需要在仓库录下建个.gitignore件(其与.git是平级的)配置语法:
增加/删除件
添加指定件到暂存区git add [file1] [file2] ...
#添加指定录到暂存区,包括录git add [dir]
#添加当前录的所有件到暂存区git add .
#交互式添加改动到暂存区git add -p
#删除作区件,并且将这次删除放暂存区git rm [file1] [file2] ...
#停追踪指定件,但该件会保在作区git rm --cached [file]
#重命名名件,并且将这个重命名放暂存区git mv [file-original] [file-renamed]
提交暂存区到仓库区git commit -m [message]
#提交暂存区的指定件到仓库区git commit [file1] [file2] ... -m [message]
#提交作区上次commit之后的变化,直接到仓库区git commit -am [message]
#提交时显示所有diff信息git commit -v
#使次新的commit,替代上次提交#如果代码没有任何新变化,则来改写上次commit的提交信息git commit --amend -m [message]
#重做上次commit,并包括指定件的新变化git commit --amend
提交暂存区到仓库区git commit -m [message]
#提交暂存区的指定件到仓库区git commit [file1] [file2] ... -m [message]
#提交作区上次commit之后的变化,直接到仓库区git commit -am [message]
#提交时显示所有diff信息git commit -v
#使次新的commit,替代上次提交#如果代码没有任何新变化,则来改写上次commit的提交信息git commit --amend -m [message]
#重做上次commit,并包括指定件的新变化git commit --amend
出所有tag git tag
#新建个tag在当前commit git tag [tag]
#新建个tag在指定commit git tag [tag] [commit]
#查看tag信息git show [tag]
#提交指定taggit push [remote] [tag]
#提交所有taggit push [remote] --tags
#新建个分,指向某个taggit checkout -b [branch] [tag]
显示有变的件git status
#显示当前分的版本历史git log
#显示commit历史,以及每次commit发变的件git log --stat
#显示某个件的版本历史,包括件改名git log --follow [file]git whatchanged [file]
#显示指定件相关的每次diff git log -p [file]
#显示指定件每的最后修改和时间git blame [file]
#显示暂存区和作区的差异git diff
#显示暂存区和上个commit的差异git diff --cached []
#显示作区与当前分最新commit之间的差异git diff HEAD
#显示两次提交之间的差异git diff [first-branch]...[second-branch]
#显示某次提交的元数据和内容变化git show [commit]
#显示某次提交发变化的件git show --name-only [commit]
#显示某次提交时,某个件的内容git show [commit]:[filename]
#显示当前作区的操作历史git reflog
拉取远程仓库的所有变动(影响作空间) git fetch [remote]
#显示所有远程仓库git remote -v
#显示某个远程仓库的信息git remote show [remote]
#增加个新的远程仓库,并命名git remote add [shortname] [url]
#取回远程仓库的变化,并与本地分合并(pull = fetch + merge) git pull [remote] [branch]
#上传本地指定分到远程仓库git push [remote] [branch]
#强推送当前分到远程仓库,即使有冲突git push [remote] --force
#推送所有分到远程仓库git push [remote] --all
撤销
git checkout 46bce36e60669dec51968a0f7d1f867a5451511d app/src/main/java/com/example/aa/gittest/MainActivity.java
可以回到mainactivity在46。。。。这次提交的样子!很实用!
恢复暂存区的指定件到作区git checkout [file]
#恢复某个commit的指定件到作区git checkout [commit] [file]
恢复上个commit的所有件到作区git checkout .
#重置暂存区的指定件,与上次commit保持致,但作区变git reset [file]
#重置暂存区与作区,与上次commit保持致git reset --hard
#重置当前分的指针为指定commit,同时重置暂存区,但作区变git reset [commit]
#重置当前分的HEAD为指定commit,同时重置暂存区和作区,与指定commit致git reset --hard [commit]
#重置当前HEAD为指定commit,但保持暂存区和作区变git reset --keep [commit]
#新建个commit,来撤销指定commit#后者的所有变化都将被前者抵消,并且应到当前分git revert [commit]
vim test.txt保存退出:按esc再输入:wq
rebase,先找到experiment和master共同节点c2#从experiment分c2后的所有commit(c4),砍掉后在master上进衍变为c4' git checkout experimentgit rebase master
# rebase的过程个个commit进衍变的#如遇冲突,会个个接着提示,解决冲突后git add [conflic-files]git rebase --continue
#如果接下来还有冲突,解决冲突后,重复上的操作,直到所有的冲突解决完毕git add [conflic-files]git rebase --continue
#如果冲突太多,想合并,可以使以下命令终合并,回滚操作git rebase --abort
总结merge会成次merge commit,merge commit是个双亲节点rebase会保持log在条线上,但是会改变提交历史(c4和c4'的commit id样)如遇冲突,merge会要求次性解决所有冲突,rebase则要求个个解决冲突
需要注意的是,push出去的commit,允许进rebase,原因就是因为它的commit id会改变
最后,在看下三个:
1.git cherry-pick XX
git cherry-pick 然后还要记得push
2.查看当前log 是在那个分支拉取的(有的时候可能不能显示,但是我在公司项目中能实现)
3.reset XXX 还原本地,还原远程的:
git reset --hard 684907fc96e48c93c625c56398e283bd1d0f67d8
git commit -m"XXXX " --no-verify 跳过代码检查;