Git 的常用命令操作

187 阅读5分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

使用配置

创建git库

去要丢到git库的目录下,执行 命令

git init  # 创建git库

配置Git库对应的帐号

### 配置所有 Git 仓库的 用户名 和 email 
$ git config --global user.name "Your Name"
$ git config --global user.email "youremail@example.com"

### 配置当前 Git 仓库的 用户名 和 email
$ git config user.name "Your Name"
$ git config user.email "youremail@example.com"

### 查看全局配置的 用户名 和 email 
$ git config --global user.name     查看用户名
$ git config --global user.email     查看邮箱地址

### 查看当前仓库配置的 用户名 和 email 
$ git config user.name     查看用户名
$ git config user.email     查看邮箱地址

# Git 是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址
# git config 命令的 --global 参数,用了这个参数,表示你这台机器上所有的 Git 仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址(不加 --global)。

工作区 与 暂存区

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

工作区即是我们的代码位置;

暂存区(stage)用于保存待提交的文件列表;

image.png

git 的提交操作分为两步

  • 一是先使用 git add 命令,将文件修改添加到暂存区;

  • 二是使用 git commit 命令,将暂存区的文件一次性提交到分支。

每次修改都需要将文件git add到暂存区

每一次要提交的修改都要先提交到暂存区中。如果再先使用git add 命令后,再次修改文件而没有使用git add,就使用git commit,那么第二次的修改是不会被提交到版本库的。

提交代码

git add readme.txt # 将readme.txt文件添加到仓库
git commmit -m "提交内容" # 提交上一步add进去的文件
git status # 检查更新的文件状态
git diff readme.txt # 对比查看修改的内容

git commit -am 'add并提交内容' # 使用该命令可直接提交

撤销更改

如果修改了代码,想撤销修改

git checkout -- readme.txt # 回退readme.txt文件在工作区中的修改
# 有两种情况
# 一种是未使用git add,即未将修改的文件丢到暂存区,那么撤销就会回到和版本库一样的状态
# 还有一种是使用git add后,即将修改的文件丢到了暂存区,又做了修改,那么撤销修改就会回到添加到暂存区后的状态。

当使用了git add命令后,想将暂存区的修改撤销。

git reset HEAD readme.txt 

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

回退版本

如果使用了git commit将暂存区的修改提交到了版本库,又想回退

git log --pretty=oneline # 查看git提交的日志,也可以直接使用git log,不过太长了,需要按Q退出
git reset --hard HEAD^	# 回退到上一个修改的版本
git reset --hard 55db9... # 回退到指定的版本,最后一参数为提交的id,不用输全,前几个即可
git reflog # 查看使用过的git命令,当找到回退版本的commitId时可以这样找到

删除文件

git rm readme.txt

分支管理

git可以存在多个分支,创建git库后会默认生成一个master分支。

创建并合并分支

git branch # 查看分支
git branch <name> # 创建分支
git switch <name> # 切换分支,也可以使用 git checkout <name> 
git switch -c <name> # 创建并切换分支,也可以使用 git checkout -b <name> 
git merge <name> # 合并某分支到当前分支
git branch -d <name> # 删除分支

解决冲突

当两个分支合并时,由于修改的内容位置是一致的,这种情况下有可能会导致合并冲突,即使用git merge命令报错了。这种情况下需要我们把Git合并失败的文件手动编辑为我们希望的内容,再提交。

# 检查合并失败的文件
git status 
# 在需要保留的分支里修改内容,提交
# 再次合并
git merge <name>
# 查看分支合并图
git log --graph
# 删除不要的分支
git branch -d <name>

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

Bug 分支

如果想要将别的分支下的某个提交复制到当前分支下,可以使用git cherry-pick命令进行复制。

git cherry-pick commit-id # 指定分支下的某个提交 复制到当前分支下

如果需要线上修复bug,则确定线上的分支是哪个,然后在对应的分支下创建临时分支。例如要修改的分支是master。

# 切换到master 
git switch master  # git checkout master

# 创建名为issue-101的临时分支,并切换
git switch -c issue-101 # git checkout -b issue-01

## 修改xxx.java的代码,修复
git add xxx.java 
git commit -m "fix-issue-101" 

# 提交后,回到master分支,合并master和issue-101临时分支
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101

# 线上的分支bug已经修改了,但其它开发分支依旧存在该问题,这种情况下就可以使用 cherry-pick 命令将修复的提交复制到其它分支上
git cherry-pick 4c805e2 # 在开发分支上复制master的这个commit id

如果想暂时保存工作区的修改,可以使用stash命令将修改保存起来。

git status # 工作区有修改
git stash # 存储工作区的代码
git status # 工作区是干净的,没修改

# 修改完后,需要将stash 存储的修改拿出来
git stash pop # 将存储的修改拿出并删除
git stash apply # 将存储的修改拿出
git stash drop # 删除存储的修改

删除分支

git branch -d xxxbranch
# 如果该分支有提交修改,会删除失败,需要强制删除
git branch -D xxxbranch

git fetch与 git pull

git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。