赞
踩
2017/3/4 更新fetch、pull、rebase相关的命令,长期不定时更新必要的git命令。
根据自己的情况,下载安装Git(我这里是windows 10)。Git的使用可以通过命令行或者图形界面使用,这里推荐命令行并且只讨论通过命令行的方式使用。
安装好后,在文件系统的任意位置(比如桌面)右击鼠标,你会看到有个Git Bash Here,这个就是我们要的。
找到你需要使用git的项目文件夹,然后在该文件夹下右击鼠标,打开git bash(或者先打开git bash然后切换到目标文件夹),接着就可以开始使用git了:
注:按照日常使用git的顺序来罗列
git init —— 将当前所在的文件夹变成git仓库,也就是初始化一个git仓库。
git add filename.txt
修改文件后,请求将filename.txt放入git暂存区,这条语句可以多次实施
git add ./
请求将当前目录所有更改的文件放入git暂存区,这条语句可以多次实施。
git commit -m "add file success"
提交修改请求,将暂存区内容提交到版本库,更新版本库最新版本(不管之前add了几次,全部一次提交),-m后面是本次提交的文字说明
git status
查看仓库当前状态,查看有没有add和commit等信息
git log
查看**最近几个**commit的详细历史记录,会得到每一个commit的类似如下的信息:
commit a9ca35f38c7bbd0e91af5e05dc7a88bc5f76a00d
Author: DongHui
Date: Sun Nov 20 18:14:17 2016 +0800
first
第二行的一串数字字母是commit id,最后的first是该commit的说明
git log --pretty=oneline
查看**所有**commit的简易历史记录。顾名思义,只用一行显示每个commit信息
git diff
查看当前工作区(也就是你最新的修改了但还没有add的项目文件)和暂存区的不同。
git diff filename.txt
和git diff一样,不过是查看具体文件。
git diff HEAD
查看当前工作区,和git版本库里最新版本的不同
git diff HEAD -- filename.txt
和git diff HEAD一样,不过是查看具体文件
git checkout – filename.txt
撤销filename.txt当前工作区的修改,不管现在工作区暂存区版本库是什么状态,这条语句的本质是:暂存区内容覆盖工作区内容。如果之前并没有任何add操作,那么执行这条语句后,filename.txt的工作区、暂存区和版本库应该是一致的。
git checkout ./
撤销当前工作区全部文件的修改。本质同上
git diff --cached 或者 git diff --staged`
查看当前暂存区和git版本库里最新版本的不同
git reset HEAD -- filename.txt
撤销暂存区的修改,这条语句的本质是:版本库最新版本覆盖暂存区,工作区不受影响。
git reset HEAD 或者 git reset
撤销暂存区的修改。本质同上。
git reset --hard HEAD^
回退到上一个版本,其中HEAD表示当前版本,HEAD^表示上一个版本
git reset --hard HEAD^^
回退到上上个版本
git reset --hard HEAD~100
回退到往上100个版本
git reset --hard 123456
转到commit id为123456……的那个版本,commit id很长且唯一,只要写出前几位(6位足够了)git会自动识别是哪一个commit,使用这条命令不仅可以回退到某个历史版本,也可以定位到比较新的版本。
但是怎么查看commit id呢?
git reflog
列出所有命令记录
git rm filename.txt
从版本库中删除filename.txt
以github为例,新建好github仓库(配置过程不赘述)
git remote add origin git@github.com:DongHui44/myfirstrepository.git
使用SSH的方式关联远程库(配置SSH方法另行查询)其中DongHui44是我的github账号,myfirstrepository是我的远程仓库。
git remote add origin https://github.com/DongHui44/myfirstrepository.git
使用https的方式关联远程库
推荐SSH的方式关联,关联后,远程仓库的默认名称为origin,想改也可以改。
git push -u origin master
第一次推送master分支的所有内容
git push origin master
推送到远程仓库的master的分支,在这之前要先commit。这里的master也可以是其他分支
git clone git@github.com:DongHui44/myfirstrepository.git
在合适的地方将远程的仓库克隆到本地,在此之前,同样要配置SSH。在克隆的时候,git自动把远程库的master分支和本地的master分支对应起来,远程库的默认名称为origin
git remote
查看远程仓库的信息
git remote -v
查看远程仓库的详细信息
git push --set-upstream origin newFunction
远程库没有本地的分支的话,第一次push要使用这条语句,那么远程库也会创建一个名为newFunction的分支仓库与之对应,同时上传本地内容
git fetch origin
获取远程库的所有分支最新版本到本地
git fetch origin remoteBranch
获取远程库分支remoteBranch最新版本到本地,这个时候本地代码未受到影响,可以将两者进行对比等操作
git pull origin remoteBranch
相当于以下两条命令
git fetch origin remoteBranch
git merge origin/remoteBranch
git checkout -b newFunction
创建分支newFunction并切换到newFunction
上面一句相当于以下两句命令:
git branch newFunction
创建分支newFunction
git checkout newFunction
切换到newFunction
git branch
查看所有分支,其中当前所在分支的前面会标注星号*
git checkout master
在newFunction下修改文件A并add、commit后,切换到master分支
git merge newFuction
把newFunction的修改合并到master中,不推荐使用这条语句,因为有时候merge会处于Fast forward模式,这种模式下,合并分支后,newFunction分支相关信息会被删除。建议合并时采用下面的语句,禁用Fast forward模式
git merge --no-ff -m "merge info" newFunction
合并newFunction的修改到master中,合并后newFunction依然存在,需要删除时手动删除即可。
注意:如果newFunction和master各自修改了同样的地方,产生了冲突,那么git merge会失败,git会给出提示,将冲突的地方修改好即可再次merge
接下来讲rebase,rebase和merge很类似,都是合并分支,但是**一般情况下不建议用rebas**e,为什么呢?下面会讲
git rebase newFunction
合并newFunction到master
下面看看rebase和merge的区别,它们的过程如下图所示
说明1:master是主分支,branch是另一个分支,master0,master1,branch0这些都是commit记录
说明2:merge采用git merge –no-ff -m “merge info” branch name这条语句,所以会有master4
我们假设merge和rebase的过程一帆风顺,当要把branch合并到master时,merge是形成一个新的提交master4,而branch中的commit也会按照时间先后插入到master的commit记录。而rebase的情况就和上图一样,rebase后master的commit记录一定是这样的:master0->master1->branch0->branch1->branch2->master2->master3,而原来的branch不受影响,是不是突然理解了为什么叫rebase了?
使用rebase表面上看起来和merge是一样的,但实际git在背后的操作完全不一样。merge的commit记录是严格按照时间显示的,分支上commit在通过merge合并到主分支后,其commit记录也按照时间的前后合并到主分支,而rebase不是这样。结论:rebase和merge很像,但是有一个坏处:让你commit记录变得混乱。
注意:如果newFunction和master各自修改了同样的地方,产生了冲突,那么git rebase会失败,先解决冲突,然后执行下面的命令:
git rebase --continue
运行这条语句继续rebase,这里要注意,执行这条语句前要先执行git add
git branch -d newFunction
删除分支newFunction
git stash
将当前未提交(但是还不能提交)的工作现场储藏起来。有的时候要立刻停止当前工作,创建分支,解决问题,合并分支,然后接着原来的工作,这个时候就要用到这条命令。这条语句可以多次使用。
git stash list
查看储藏起来的工作现场
git stash apply
恢复工作现场,此时,储藏的工作现场并没有删除
git stash drop
删除储藏的工作现场
git stash pop
恢复工作现场,同时把储藏的工作现场删除
git tag v1.0
在最新commit的基础上,给当前分支打一个标签,可以表示版本号等等,这里的标签是:v1.0
git tag
查看所有标签,标签是按字母排列的
git tag v0.1 123456
给commit id是123456开头的commit打标签,标签为:v0.1
git show v1.0
查看标签为v1.0的commit的详细信息
git tag -d v1.0
删除标签v1.0
git push origin v0.1
推送标签v0.1到远程仓库
git push origin --tags
推送所有标签到远程仓库
git push origin :refs/tags/v0.1
删除远程仓库里的v0.1标签,在这条命令前要确保之前已经在本地删除了v0.1标签
git config --global color.ui true
配置ui的颜色
在实际应用git时,有一些文件不能也没有必要被push到远程仓库,git提供了解决方案。
在git工作区的根目录下新建一个.gitignore文件,在里面配置想要git忽略推到远程仓库的文件类型。(作为安卓开发者,额外提一句:Android Studio好像自动帮我们创建了.gitignore文件,其他软件不清楚)
工作区内容不同,配置也相应不同,具体可参考:https://github.com/github/gitignore该github项目提供了各种工作内容需要配置的忽略文件。
git add -f example.class
强制add某个文件,不管这个文件有没有被忽略,这里是example.class。
如果git add失败并被系统提示已经进入忽略名单,那么可以使用以下命令查看忽略详情
git check-ignore -v example.class
查看example.class被忽略的详情
回车后,系统会返回信息,例如:
.gitignore:3:*.class example.class
意思是.gitignore文件的第三行的*.class导致的忽略。
git可以给系统指令改别名
git config --global alias.st status
意思是用st代替status,以后每次要查看状态(git status)只需要git st就行了,–global意思是该用户下全局生效。
再举例子:
git config --global alias.co checkout
用co代替checkout
注1:git命令繁多,本文没有提到的可以自己查询或者看注2本文所参考的教程,英文好的可以直接去官网看看。
注2:参考资料:廖雪峰的git教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。