0%

Git 常用操作

  1. 1. 远程仓库操作
    1. 检查保存的远程仓库地址
    2. 移除远程仓库地址
    3. 查看远程仓库地址
    4. 从远程仓库同步分支信息
    5. 推送到远程仓库
  2. 2. 分支操作
    1. 查看本地及远程分支
    2. 创建新的分支
    3. 更改当前分支
    4. 对比分支
    5. 合并分支
    6. 删除分支
  3. 3. 常用组合技
    1. 一次提交
    2. 版本回退
    3. 查看提交记录/版本变更记录
      1. 在命令行打印时出现乱码
      2. powershell中输出到文件出现乱码
    4. 添加、查看、删除远程仓库
    5. 查看远程仓库的分支更新情况并合并
    6. 创建一个分支
    7. 合并分支
    8. 使文件(夹)与其他分支的一至

1. 远程仓库操作

检查保存的远程仓库地址

1
2
3
git remote add [name] [ssh-url]
# eg: git remote add gitee git@gitee.com:whuls/example.git
# git remote add github git@github.com:whuls/example.git

移除远程仓库地址

1
2
git remote rm [name]
# eg: git remote rm gitee

查看远程仓库地址

1
2
3
git remote -v
# gitee git@gitee.com:whuls/example.git
# github git@github.com:whuls/example.git

从远程仓库同步分支信息

1
2
git fetch [name] [branch]
# eg: git fetch origin master

推送到远程仓库

1
2
git push [name] [branch]
# eg: git push origin master

可以为当前的分支设置上传流(upstream),设置方式如下:

1
2
git checkout branch1
git branch --set-upstream-to origin/branch1

1
2
git checkout branch1
git branch -u origin/branch1

设置上传流之后表明确定了当前分支默认关联的远程分支,不需要每次推送(push)时都指定分支,因此推送操作可以简化为:

1
git push origin

也可以设置上传流为本地分支,不过好像除了检查同步之外没有别的便利之处。

2. 分支操作

查看本地及远程分支

xxxxxxx是分支所在的版本id,msg是该版本对应的提交信息。

1
2
3
4
git branch -v -a
# branch1 xxxxxxx msg......
# master xxxxxxx msg......
# remotes/origin/master xxxxxxx msg......

创建新的分支

1
2
git branch [local_branch_name]
# eg: git branch branch1

更改当前分支

1
2
git checkout [local_branch_name]
# eg: git checkout branch1

对比分支

1
git log -p [branch1]..[branch2]

两个分支可以是本地分支也可以是远程分支。只有写在后面的分支比前面的分支新,这条命令才会显示对比信息,否则显示为空。

1
2
3
4
5
6
7
8
9
10
git log -p master..branch1
# commit dca801bdbddb005bac36bf6a296b333952c54dac (HEAD -> linetrack)
# Author: whuls <hayzlsls@163.com>
# Date: Wed May 5 15:52:54 2021 +0800
#
# 123
#
# diff --git a/aaa b/aaa
# new file mode 100644
# index 0000000..e69de29

合并分支

合并(远程)分支

1
2
git merge [name]/[branch]
# eg: git merge gitee/branch1

合并(本地)分支

1
2
git merge [local_branch_name]
# eg: git merge branch1

删除分支

删除本地分支

1
git branch -d branch1

如果branch1与当前分支不同(存在更改),则可以合并后再删除,或者使用强制命令-D

1
git branch -D branch1

删除远程分支:在push的时候加上--delete参数或者在分支前加上冒号:

1
2
git push origin --delete branch1
git push origin :branch1

3. 常用组合技

一次提交

1
2
3
4
5
git remote -v
git remote add origin git@gitee.com:whuls/whuls
git add .
git commit -m "Your message"
git push origin

版本回退

强制回退到上一个版本、上上个版本…上100个版本。

1
2
3
4
5
6
7
git reset --hard HEAD^
git reset --hard HEAD^^
# ...
git reset --hard HEAD~100

# 或者使用版本号
git reset --hard 54abdcf

撤销提交

1
2
git reset 54abdcf
git reset HEAD^

二者的区别在于是否强制更改文件内容。使用--hard参数时会强制改变文件内容,不仅会回退到指定版本,还会把文件也改了,而不指定该参数则只会修改提交内容,不会更改文件。

查看提交记录/版本变更记录

查看提交记录

1
2
3
4
5
6
# 直接在命令行打印
git log
# 简化版
git log --pretty=oneline
# 打印到文件
git log > log.txt

查看版本变更记录

1
git reflog

如果命令太长,在命令行内显示后无法退出,按下q即可。

在命令行打印时出现乱码

PowerShell | git log 中文乱码问题解决

1
2
3
4
5
6
7
git config --global core.quotepath false
git config --global gui.encoding utf-8
git config --global i18n.commit.encoding utf-8
git config --global i18n.logoutputencoding utf-8
# 以下二者均可
$env:LESSCHARSET='utf-8'
$env:LC_ALL='C.UTF-8'
1
2
3
4
5
# cmd
set LESSCHARSET=utf-8 # 设置
set LC_ALL=C.UTF-8
set LESSCHARSET # 查看
set LC_ALL

或者直接把LESSCHARSETLC_ALL添加到系统环境变量。

powershell中输出到文件出现乱码

在cmd窗口中,设置环境变量后打印在命令行不会出现中文乱码;不设置环境变量时直接输出到文件不会出现中文乱码。

1
2
set LESSCHARSET=utf-8
git log
1
git log > a.txt

以上代码的执行结果都不会出现乱码。唯独这该死的powershell啊,无论有没有设置环境变量,输出到文件均会出现乱码😡。

这是由于powershell输出重定向(操作>)文件编码默认为UTF-16(LE),将其改为UTF-8的方法如下:

1
git log | Out-File a.txt -Encoding utf-8

但是输出的文件编码格式为UTF-8 With BOM,还是乱码,暂时无法解决。

添加、查看、删除远程仓库

1
2
3
git remote add origin git@gitee.com:whuls/whuls
git remote -v
git remote rm origin

查看远程仓库的分支更新情况并合并

1
2
3
4
git fetch origin
git branch -v -a
git checkout branch1
git merge origin/master

创建一个分支

1
2
git branch branch1
git checkout branch1

合并分支

1
2
3
git branch -v -a
git checkout branch1
git merge master

使文件(夹)与其他分支的一至

例如在master分支下更新了README.md文件,或更新了docs文件夹的文件,在branch1中要使对应的文件一至,可以使用如下操作:

1
2
3
git checkout branch1
git checkout master README.md # 文件
git checkout master docs # 文件夹

该操作仅仅是将文件或文件内容复制过来,并不会修改版本号之类的东西。