欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用通俗易懂的语言解释 Git 的常用命令,让你快速上手!

最编程 2024-06-10 12:00:37
...
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 show 1234567 —— 查看commit id 为1234567...的详细信息

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 1234567 —— 转到commit id为1234567......的那个版本,commit id很长且唯一,只要写出前几位(7位足够了)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很类似,都是合并分支,但是一般情况下不建议用rebase,为什么呢?下面会讲

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


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


2017/2/23

推荐阅读