前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GIT命令操作全攻略,请收下我的膝盖!

GIT命令操作全攻略,请收下我的膝盖!

作者头像
Java极客技术
发布2022-12-04 10:22:03
6520
发布2022-12-04 10:22:03
举报
文章被收录于专栏:Java极客技术

一、简介

在介绍git操作命令之前,我们先来了解一段故事!

很多人都知道,Linus 在1991年 创建了开源的Linux操作系统,此后的三十多年里,Linux 系统不断发展,已然成为全世界最大的服务器系统软件了。

Linus 虽然创建了Linux操作系统,但是Linux操作系统的壮大是得益于全世界热心的志愿者参与的,这么多人在世界各地为Linux操作系统编写代码,那Linux操作系统的代码是如何管理的呢?

在 2002 年以前,世界各地的志愿者把源代码文件通过diff的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!

不过,到了 2002 年,Linux操作系统已经发展了十年了,代码库之大让 Linus 很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满。

可能有的同学会发出疑问,不是有 CVS、SVN 这些免费的版本控制系统吗?为什么不用它们来托管Linux操作系统代码?

因为 Linus 本人坚定地反对 CVS 和 SVN,原因是这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。

于是 Linus 选择了一个商业的版本控制系统 BitKeeper,BitKeeper 的东家 BitMover 公司出于人道主义精神,授权 Linux 社区免费使用这个版本控制系统。

随着 Linux 社区对 BitKeeper 版本控制系统的深度了解,原本安定团结的大好局面在 2005 年被打破了,原因是 Linux 社区牛人众多,一名叫 Andrew 的开发者把 BitKeeper 商业授权协议破解了(这么干的其实也不只他一个),之后被 BitMover 公司发现了(监控工作做得不错!),于是 BitMover 公司怒了,要收回 Linux 社区的免费使用权。

Linus 向 BitMover 公司道了歉,保证以后严格管教弟兄们,嗯,想要别人不破解,这其实是不可能的。

之后,Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是我们今天要介绍的 Git!(牛人是怎么定义的,大家可以自行体会一下)

一个月之内,Linux 系统的源码已经由 Git 管理了!

之后的事情,想必估计都知道,Git 迅速成为全世界最流行的分布式版本控制系统,在代码托管方面,基本上是一骑绝尘!

尤其是 2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数的开源项目开始迁移至 GitHub,包括 jQuery、PHP、Ruby等等!

说了这么多,Git 是一款什么样的软件?和 CVS、SVN 这些免费的版本控制系统有什么区别呢?

上文中我们也说到了,Git 其实是一款分布式的版本控制系统,可能你还是不太理解什么叫分布式,我们先聊聊什么是集中式!

集中方的版本控制系统,简单的说,就是当你要干活的时候,用的一般都是自己的电脑,首先要从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。

集中式版本控制系统,好处就是统一管理,但是坏处也很明显,必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

分布式版本控制系统,与集中式版本控制系统最大的不同就是:没有中央服务器这个东西。

每个人的电脑上都是一个完整的版本库,可以说每个电脑都是中央服务器,当你工作的时候,不需要联网,可以直接提交工作的内容,如果对方的电脑想要知道你的工作内容,你只需要把对应的工作文件推送过去就可以,对方就可以看到,其他不相关的文件不需要推送给对方!

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

既然git这么受欢迎,下面我们就开始git的学习之旅吧!

二、安装 GIT

2.1、在 Linux 上安装 Git

如果你当前的电脑操作系统是 Linux,安装起来会非常简单,首先试着输入git,看看系统有没有安装Git:

代码语言:javascript
复制
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

像上面的命令,有很多 Linux 会友好地告诉你 Git 没有安装,还会告诉你如何安装 Git。

按照提示,输入如下命令,即可安装git

代码语言:javascript
复制
sudo apt-get install git
2.2、在 Mac OS X 上安装 Git

如果你正在使用 Mac 做开发,有两种安装 Git 的方法!

一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/

第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,因为Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单Xcode->Preferences,在弹出窗口中找到Downloads,选择Command Line Tools,点Install就可以完成安装了。

XcodeApple官方IDE,功能非常强大,是开发MaciOS App的必选装备,而且是免费的!

2.3、在 Windows 上安装 Git

Windows上使用Git,就比较傻瓜式了,可以从Git官网直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到Git->Git Bash,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

以上全部安装完成后,还需要最后一步设置,在命令行输入:

代码语言:javascript
复制
#配置全局用户名
git config --global user.name "Your Name"

#配置全局邮箱
git config --global user.email "email@example.com"

配置的你用户名和邮箱,因为Git是分布式版本控制系统,所以,每个机器都必须自报家门!

三、GIT 操作手册

在上文中,我们对git的安装进行了一些简单的介绍,等环境准备完成之后,我们就可以开启GIT之旅!

3.1、配置管理

在上文中,我们有介绍了全局配置用户名和邮箱,假如你的用户和邮箱输入错误了,想修改,怎么办呢?

同样可以用如下的命令,进行修改!

代码语言:javascript
复制
#重新配置用户名
git config --global user.name "zhangsan"

#重新配置邮箱
git config --global user.email "zhangsan@example.com"

同时,还可以通过如下命令查询配置

代码语言:javascript
复制
#查看当前配置
git config --list

如果你想针对某个库,设置用户名和邮箱,直接当前仓库根路径下,通过如下方式可以实现单独配置!

代码语言:javascript
复制
#配置某个仓库的用户名、邮箱
git config user.name "Your Name"
git config user.email "email@example.com"

如果你配置的仓库,用户和密码填错了,可以通过如下命令方式清除,然后重新配置!

代码语言:javascript
复制
git config --system --unset credential.helper
3.2、版本管理

版本库管理是GIT最重要的核心模块,具体操作如下!

当你想向GIT里面提交一个文件的时候,首先需要初始化一个版本库

代码语言:javascript
复制
#初始化一个版本库
git init

然后,可以通过如下命令,添加或者修改一个的指定文件!

代码语言:javascript
复制
#添加或者修改一个的指定文件
git add <文件名>

当然,你还可以通过如下命令,添加当前目录下全部的文件!

代码语言:javascript
复制
#添加或者修改的所有文件
git add --all

添加完成之后,还需要提交文件,命令如下

代码语言:javascript
复制
#提交文件
git commit -m <注释>

例如,提交所有的内容提交到版本库!

代码语言:javascript
复制
#例如,提交所有的文件添加修改提交到版本库
git commit -m "注释内容"

有些时候,我们需要通过一下命令,查询当前工作区的信息。

比如,查看当前工作区的状态,这个基本上经常用到!

代码语言:javascript
复制
#查看当前工作区的状态
git status

查询当前版本库的历史提交日志纪录,这个会在版本回滚的时候用到!

代码语言:javascript
复制
#查看历史日志
git log

#查看精简日志
git log --pretty=oneline

查看当前文件的内容!

代码语言:javascript
复制
#查看文件内容
cat <文件名>

查看历史提交的命令!

代码语言:javascript
复制
#查看历史提交的命令
git reflog

查看文件修改内容!

代码语言:javascript
复制
#查看当前文件修改内容
git diff <文件名>

查看工作区和版本库里面最新版本的区别!

代码语言:javascript
复制
#查看当前文件和版本库里面最新版本的区别
git diff HEAD -- <文件名>

如果你想将当前文件回滚到历史上某个时间点提交的文件,可以通过如下命令!

代码语言:javascript
复制
#首先查询你要回滚到历史上某个时间点的版本ID
git log --pretty=oneline

#然后通过如下命令,进行回滚操作
git reset --hard <版本id>

当你修改了某个文件,但是没有提交,想要回滚,怎么处理呢?可以通过如下命令进行撤回!

代码语言:javascript
复制
#撤销某个文件的修改
git checkout -- <文件名>

如果你想全部撤销,可以通过如下命令撤回全部!

代码语言:javascript
复制
#撤销所有修改
git checkout .

当然,如果你不想要某个文件了,可以通过如下方式删除!

代码语言:javascript
复制
#删除指定文件
git rm <文件名>
3.3、分支管理

GIT的分支管理,非常强大,也是它远胜 CVS、SVN 这些免费的版本控制系统一大神器!

GIT在初始化版本库的时候,会默认创建一个master分支,也就是主干分支!

如果你想创建某个分支,可以通过如下命令创建!

代码语言:javascript
复制
#创建分支
git branch <分支名>

比如,创建一个develop分支!

代码语言:javascript
复制
git branch develop

当执行这个命令之后,GITdevelop分支指针会指向到当前分支当前位置!

怎么切换到分支呢?我们可以通过git checkout命令,实现分支的切换!

代码语言:javascript
复制
#切换分支
git checkout <分支名>

当然,你还可以一步到位,通过如下命令,创建并切换分支!

代码语言:javascript
复制
#创建分支+切换分支
git checkout -b <分支名>

通过下面这个命令,可以查询当前分支!

代码语言:javascript
复制
#查看当前分支
git branch

如果分支切换失败,可以通过git status命令查询一下为什么会失败,分支切换失败多半是当前工作区的代码没有提交到版本库里面导致,可以检测一下是不是代码都提交到本地版本库!

在平时的开发过程中,我们会经常碰到需要合并分支,比如将develop分支合并到master分支,怎么处理呢?

可以通过如下命令,实现快速合并!

代码语言:javascript
复制
#快速合并分支
git merge <分支名>

在合并的时候,可能会出现文件发生冲突的情况,如果出现,就排查修改文件,然后提交!

当然,你还可以通过如下命令,来实现分支合并提交!

代码语言:javascript
复制
#普通模式合并分支+提交
git merge --no-ff -m "merge with no-ff" <分支名>

如果某个分支,你不想要了,想删除,可以通过如下命令实现!

代码语言:javascript
复制
#删除分支
git branch -d <分支名>

如果删除过程中,出现报错,可以下面这个命令,强行删除!

代码语言:javascript
复制
#强行删除分支
git branch -D <分支名>

最后,你可以通过下面这个命令,查询当前版本分支的变动情况!

代码语言:javascript
复制
#查看分支合并图
git log --graph
3.4、标签管理

标签管理,也是git最最核心的功能!通过标签,我们可以很快的定位到仓库中某个版本,并进行代码回滚!

可以通过如下命令创建某个标签,比如v1.0标签。

代码语言:javascript
复制
#创建标签
git tag v1.0

查看标签情况

代码语言:javascript
复制
#查看所有的标签
git tag

如果你想看某个标签,具体的详情,可以通过如下命令!

代码语言:javascript
复制
#查看标签信息
git show <标签名>

如果你不想要了,可以通过如下命令,删除标签!

代码语言:javascript
复制
#删除标签
git tag -d <标签名>

当然,如果你想针对某个历史版本,打标签,可以通过如下方式实现!

代码语言:javascript
复制
#查看历史版本id
git log --pretty=oneline --abbrev-commit

#对某个版本ID,打上标签,名称v0.9
git tag v0.9 <版本id>

我们还可以将标签推送到远程分支,命令如下:

代码语言:javascript
复制
#推送全部标签到远程库
git push origin --tags

删除远程标签库

代码语言:javascript
复制
#删除本地标签
git tag -d v0.9

#推送到远程分支
git push origin :refs/tags/<标签名>
3.5、忽略文件管理

GIT还为我们提供了一个巨大的利器,我们可以通过配置忽略文件,将当前目录中某些文件忽略掉,不提交到版本库里面,具体怎么操作呢?

  • 首先在当前版本库根目录下,创建一个.gitignore文件,内容自己定义,比如下面这个内容,就是小编定义的忽略文件,
代码语言:javascript
复制
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
*.class

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/build/

### mac ###
.DS_Store
file/
logs/
*/target
target/

然后,执行如下命令,让忽略文件生效!

代码语言:javascript
复制
#清除缓存
git rm -r --cached .

#添加所有文件
git add .

#提交到版本库
git commit -m "update .gitignore"

#提交到远程分支(如果有的话)
git push
3.6、远程仓库管理

以上介绍的基本上都是本地仓库的操作,如果我们需要与其他的电脑协助工作,怎么处理呢?

如果我们本地没有仓库,我们可以直接从远程分支里面拉取一个版本库同步到本地,命令如下。

代码语言:javascript
复制
#从远端服务器创建主分支
git clone <url>

我们可以通过如下命令,查询远程分支的详情

代码语言:javascript
复制
#查看远程库
git remote -v

如果你是通过git init方式初始化了本地仓库,想与远程分支关联,可以通过如下命令实现!

代码语言:javascript
复制
#添加远程地址
git remote add origin <url>

如果你填写错了,想删除,可以通过如下命令删除,再重新添加!

代码语言:javascript
复制
#删除远程提交地址
git remote rm origin

如果你之前没有推送内容到远程库,可以通过如下命令推送

代码语言:javascript
复制
#首次推送到远程库并创建分支
git push -u origin <分支名> (第一次将内容推送到master分支)

后期推送到远程分支,可以这样操作

代码语言:javascript
复制
#后期推送到远程分支
git push origin <分支名>

#可以简写,快速推送
git push

有时候,我们还需要查询远程分支的情况,可以通过如下命令操作:

代码语言:javascript
复制
#查看远程的所有分支
git branch -a

有时候,我们还需要从远程服务器拉取某个指定的分支到本地,可以通过下面这个命令完成:

代码语言:javascript
复制
#从远程服务器拉取某个指定的分支到本地,并创建分支
git checkout -b <分支名>  origin/<分支名>

大部分的情况下,当远程服务器更新了版本库,通知我们也要更新时,通过如下方式,即可将远程的版本库最新的内容同步到我们本地电脑版本库里面。

代码语言:javascript
复制
#拉取远程分支内容,并同步到本地版本库
git pull

有时候,需要设置本地分支与远程分支的链接,可以通过下面这个命令完成:

代码语言:javascript
复制
#设置本地分支与远程分支的链接
git branch --set-upstream dev origin/dev

有时候,我们需要删除没有untracked的文件,可以通过下面这个命令完成:

代码语言:javascript
复制
#删除没有untracked的文件
git clean -d -xf
3.7、冲突处理

版本同步的时候,如果大家都修改了同一个文件,难免会发生冲突。

比如,当修改的文件未提交,直接远程拉取代码会发生冲突,改怎么办呢?

可以这样处理

代码语言:javascript
复制
#先将本地修改存储起来
git stash

#暂存了本地修改之后,就可以pull了
git pull

#还原暂存的内容
git stash pop stash@{0}

此时系统会提示如下类似的信息:

代码语言:javascript
复制
Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c

意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。

然后打开冲突的文件,进行修改,修改完毕之后,执行如下命令进行提交!

代码语言:javascript
复制
git add .
git commit -m "注释"
git push

当然,还可以进行强制更新操作,覆盖本地代码,命令如下!

代码语言:javascript
复制
#下载远程库内容
git fetch --all

#不做任何的合并,git reset 会把HEAD指向刚刚下载的最新的版本
git reset --hard origin/master

四、与服务器建立 ssh 连接

git中电脑与电脑之前的连接,支持的模式有两种:HTTPSSH,其中HTTP的传输会比较慢,才能SSH方式进行互推,效率会非常高!

因此,在实际的使用过程总,推荐使用SSH模式与远程服务器建立连接!

例如与GitHub的连接,具体的操作配置方式如下!

4.1、创建 SSH Key

在当前电脑用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可以直接跳过。

如果没有,打开ShellWindows下打开Git Bash),创建 SSH Key:

代码语言:javascript
复制
ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个 Key 也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是 SSH Key 的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

4.2、将公钥配置到服务端

登陆 GitHub,打开Account settingsSSH Keys页面:

然后,点Add SSH Key,填上任意Title,在 Key 文本框里粘贴id_rsa.pub文件的内容:

Add Key,你就应该看到已经添加的 Key !

至此,本地与远程服务器的连接配置已经完成,剩下的就是直接远程服务器拉取代码,然后提交的时候git push就可以了!

五、小结

本文主要围绕GIT的背景和常用的操作命令做了一些介绍,可能有些地方介绍的比较粗陋、不完美,希望老铁们能批评指出!

六、参考

1、廖雪峰 - GIT 教程

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java极客技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、安装 GIT
    • 2.1、在 Linux 上安装 Git
      • 2.2、在 Mac OS X 上安装 Git
        • 2.3、在 Windows 上安装 Git
        • 三、GIT 操作手册
          • 3.1、配置管理
            • 3.2、版本管理
              • 3.3、分支管理
                • 3.4、标签管理
                  • 3.5、忽略文件管理
                    • 3.6、远程仓库管理
                      • 3.7、冲突处理
                      • 四、与服务器建立 ssh 连接
                        • 4.1、创建 SSH Key
                          • 4.2、将公钥配置到服务端
                          • 五、小结
                          • 六、参考
                          相关产品与服务
                          云服务器
                          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档