Git的常用命令,大白话解释,让你快速上手

2017/3/4 更新fetch、pull、rebase相关的命令,长期不定时更新必要的git命令。

准备工作:

根据自己的情况,下载安装Git(我这里是windows 10)。Git的使用可以通过命令行或者图形界面使用,这里推荐命令行并且只讨论通过命令行的方式使用。

安装好后,在文件系统的任意位置(比如桌面)右击鼠标,你会看到有个Git Bash Here,这个就是我们要的。
git bash
找到你需要使用git的项目文件夹,然后在该文件夹下右击鼠标,打开git bash(或者先打开git bash然后切换到目标文件夹),接着就可以开始使用git了:

注:按照日常使用git的顺序来罗列

git init —— 将当前所在的文件夹变成git仓库,也就是初始化一个git仓库。

add和commit


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的区别,它们的过程如下图所示

merge and rebase
说明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

stash、tag的使用


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教程

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值