git使用

昨天在同事电脑上操作了一把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  跳过代码检查;

你可能感兴趣的:(git使用)