git

本文主要记录 git 使用。submodule

正常使用

origin 为代号,可以随意取

1
2
3
4
# https 方式
git remote add origin https://github.com/love1angel/testgit.git
# ssh 方式
git remote add origin git@github.com:love1angel/testgit.git

submodule 使用

创建

1
2
3
mkdir 3rdparty
cd 3rdparty
git submodule add https://github.com/google/googletest.git

下载

1
2
git submodule init
git submodule update --recursive

查看状态

1
2
3
4
5
6
7
8
9
10
11
# 正常下载好的状态
git submodule status
33af80a883ddc33d9c0fac0a5b4578301efb18de 3rdparty/googletest (release-1.8.0-3471-g33af80a8)

# 如果没有下好,带 -
git submodule status
-2954cb8d879886403d55343f941ae7d0216e0f6b 3rdparty/googletest

# 有更新,带 +
git submodule status
+33af80a883ddc33d9c0fac0a5b4578301efb18de 3rdparty/googletest (release-1.8.0-3471-g33af80a8)

更新

1
2
3
4
5
6
7
8
9
10
# 更新总仓库目前的分支,引用
git remote update

# 更新到总仓库
git submodule update --recursive

# 更新子仓库到最新的提交
git submodule update --remote
# 更新单个仓库
git submodule update --remote 3rdparty/googletest

before no use

git使用

目的:Linus为了管理Linux源码用C语言开发的分布式版本控制系统

类型:分布式

分布式 VS 集中式

  1. 集中式:CVS和SVN等
  2. 分布式:git等
  3. 集中式通常也有一台充当中央服务器的电脑,主要是为了方便交换大家的修改

集中式的缺点

  • 版本库集中存放在中央服务器,需要联网获得最新的版本
  • 只有一个中央服务器可能会宕机,导致所有人无法工作
  • 中央服务器的版本库一旦出现存在问题,难以补救,不安全

let’s start:)

准备

  1. download git
  2. 设置本机的user信息,本机所有repository都会使用这个配置,对单独的仓库也可以单独设置,通过git config命令查看参数选项
1
2
$ git config --global user.name "your name"
$ git config --global user.email "email@example.com"
  1. 查看本地global参数
1
$ git config --list --global

!!! 修改global参数后以前的提交还是以前的user参数,???git repository如何识别user呢

  1. 初始化一个仓库,会在当前目录添加一个隐藏目录(.git)
1
$ git init

!!! git 只能跟踪文本文件的改动,图片、视频这些二进制文件,没法跟踪文件的变化

changes not staged for commit

  1. untracked changes -> staged changes(update what will be committed)
1
$ git add <files>
  1. discard changes in working directory(将工作区的状态回到暂存区的状态)
1
$ git checkout -- <files>

要提交的变更

  1. staged changes -> untracked changes(将暂存区会退到到head所指的分支,并把暂存区的修改回退到工作区)
1
$ git reset HEAD <files>
  1. 提交
1
$ git commit -m ""

查看repository的状态

  1. 查看过去日志
1
$ git log
  1. 查看当前状态
1
$ git status

版本控制

  1. 回到过去(之前的修改保存到untracked changes,暂存区也回退)
1
2
$ git reset HEAD^
$ git reset HEAD~1
  1. 强制回退,可以通过commitID在回去,丢弃所有目前的修改,不建议用
1
2
$ git reset --hard HEAD^
$ git reset --hard 7f1f
  1. 查看命令历史,回到未来
1
$ git reflog

管理修改

  1. 比较工作区和HEAD指针所指向的分支
1
$ git diff

远程库

1
$ ssh-keygen -t rsa -C "youremail@example.com"
  1. 本地仓库关联远程仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 测试一下ssh-key添加是否成功
$ ssh -T git@github.com
# 关联远程仓库,本地取名叫origin
$ git remote add origin https://github.com/love1angel/work.git
# 查看本地分支,即可查看远程分支remotes/origin/main
$ git branch -a
# 将本地分支master重命名为main分支
$ git branch -M main
# 第一次push main分支,远程库会创建main分支,同时将本地main分支push到orgin的main分支,-u参数会将本地的main分支与远程的main分支关联起来
$ git push -u origin main
# 直接push main分支到origin
$ git push origin main

# 远程库
$ git remote -v
# 删除远程库联系
$ git remote rm origin

# 使用clone会自动关联远程库
$ git clone

分支管理

创建合并分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新建分支并切换
$ git checkout -b dev

# equals to
$ git branch dev
$ git checkout dev

# 检查一下
$ git branch

# 将dev分支合并到master分支
$ git merge dev

# 删除分支
$ git branch -d dev

冲突解决

1
2
3
4
5
6
7
8
9
10
11
12
# 合并分支时出现冲突,变化会保存当前分支
$ git merge fearture1

# 解决冲突后
$ git add
$ git commit

# 解决完成,合并成功,查看一下
$ git log --graph

## 禁用fast forward,fast forward是直接修改当前指针跳转,看不出来曾经做过合并,禁用会在当前分支新增一个commit
$ git merge --no-ff -m "merge with no-ff" dev

BUG分支,feature分支

1
2
3
4
5
6
7
8
9
10
11
12
13
# 保存 Saved working directory and index state WIP
$ git stash

$ git stash list

# 恢复指定的
$ git stash apply stash@{0}
# 删除stash内容
$ git stash pop stash@{0}

# 在当前分支应用某个commit
$ git cherry-pick <commit>

多人开发

1
2
3
4
5
6
7
8
# 关联本地新建dev分支到远程的dev分支
$ git checkout -b dev origin/dev

# 有人提交后,与本地有冲突,需要先pull,在本地merge,解决冲突,在推送
$ git branch --set-upstream-to=origin/<branch-name> <branch-name>

# 本地两次提交,pull下来一次提高,将本地未push的分叉提交历史拉直
$ git rebase

tag

tag就是某个commit,不过commitID不好记住,且无意义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git tag v1.0
$ git tag
$ git tag v0.9 f52c633
$ git show <tagname>
# -a指定标签名字,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb

$ git tag -d v0.1
$ git push origin v1.0
$ git push origin --tags

# 删除远程标签
$ git tag -d v0.9
$ git push origin :refs/tags/v0.9

git个性化定制

1
$ git config --global color.ui true

创建.gitignore

gitignore配置

1
2
3
4
5
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
Author

Helianthus

Posted on

2022-03-21

Updated on

2024-06-24

Licensed under