0%

Git usage

Git🎈

基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 建立repo
git init # 初始化本地repo
git clone [url] # 克隆远程repo到本地

# 连接(移除)远程repo
git remote add origin [url] # 连接
git remote rm origin # 移除

# 改branch名
git branch -M main

# add & commit
git add . # 提交所有改变到暂存区
git add "change 的文件名" # 提交单独的改变到暂存区
git commit -m "commit comment!" # 提交暂存区的内容到repo

# 查看所有文件或指定文件状态
# 查看所有文件
git status
# 查看指定文件状态
git status [filename]

# git push
git push -u origin master
# 将本地的master分支推送到origin主机的master分支。如果master不存在,则会被新建。
git push -u origin dev
# 将本地的dev分支推送到origin主机的dev分支。如果dev不存在,则会被新建。

# git pull == git fetch & merge
git pull origin master # 从远程获取最新版本并merge到本地
# 等于
git fetch origin master # 从远程获取最新版本到本地,不会自动merge
git merge origin/master
# 或者
git fetch origin master:test # 从远程获取最新的版本到本地的test分支上
git diff test # 之后再进行比较
git merge test # 合并

忽略某些文件

有时候不需要把某些文件纳入版本控制中

在repo文件夹下建立 “.gitignore” 文件,此文件有如下规则:

  1. 忽略文件中的空行、以井号(#)开始的行也会被忽略
  2. 可以使用 Linux 通配符。例如:星号(*)代表任意多个字符,问好(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1, string2,······})代表可选的字符串
  3. 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  4. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不
  5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。

注意:gitignore 对已经 git add & commit 的文件和文件夹不起作用!

1
2
3
4
5
6
7
# 为注释
*.txt # 忽略所有.txt结尾的文件,这样的话上传就不会被选中!
!lib.txt # 但lib.txt除外
/temp # 仅忽略项目根目录下的TODO文件,不包括其它目录temp
# "/" 前面的被忽略,后面的保留
build/ # 忽略build/目录下的所有文件
doc/*.txt # 会忽略doc/notes.txt但不包括doc /server/arch.txt

配置SSH公钥以及创建repo

look there!

创建repo时,可选许可证:

  1. 开源可以随意转载
  2. 开源但不可商用
  3. 等等

Git 分支

常用分支命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 列出所有本地分支
git branch

# 列出所有远程分支
git branch -r

# 新建一个分支,但依然停留在当前分支
git branch [branch name]

# 新建一个分支,并切换到该分支
git checkout -b [branch]

# 合并分支到当前分支
git merge [branch]

# 删除分支
git branch -d [branch name]

# 删除远程分支
git push origin --delete [branch name]
git branch -dr [remote/branch]

如果同一个文件在合并时都被修改了,则会引起冲突。解决办法是修改冲突文件后重新提交,选择保留它的代码还是你的代码!

简言之,如果冲突了就需要协商

Git 分支管理💥

文件添加、移除的操作

  • 当前文件夹下:git.md、本地分支:main,远程分支:origin/main
  • 新建分支:dev,添加文件 dev.txt,并将其 add & commit

    在 dev 分支下,有文件:dev.txt & figures & git.md

    但是在 main 分支下,看不到 dev.txt

image-20211227125139440
  • 合并分支:将 main 和 dev 合并!git merge [branch name]

    在 main 分支中,可以看到 dev.txt

  • 删除分支:将 dev 分支删除

合并冲突👏

合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。

简单的冲突

简单的冲突是指, bugFix 基于 main 建立后,main 不会进行提交,而是只在 bugFix分支提交!

然后 main 要 merge bugFix 时,Git 会自动帮你完成 merge

以内容添加为例
  • 往 dev.txt 中覆盖写入 “main:develop file!”,并查看
  • 新建分支 bugFix,并在 dev.txt 中追加写入:”bugFix:fix some bugs!”

    add & commit the changes

  • 在 main 和 bugFix 中查看 dev.txt
  • 合并两个分支

    使用 git merge bugFix 后,会弹出一个 vim界面,在其中写入为何要 merge

内容删减和修改就不再展示了

复杂的冲突

如果 bugFix 基于 main 建立之后, bugFix 进行了一次 commit,main 也进行了一次 commit!

这个时候如果 main 要 merge bugFix,Git 会向你报错:Automatic merge failed; fix conflicts and then commit the result.

这代表 Git 无法像前面那样自动 merge bugFix,因为现在的 main 已经提交一(好多次)次了!

  • 在 bugFix 中修改 dev.txt,add & commit
  • 回到 main 中,修改 dev.txt,add & commit
  • main 要 merge bugFix,出现报错!

    Git 无法自动合并,这时我们要手动修改代码!

    而且注意 branch 的状态:(main|MERGING) 这说明 main 正在(等待)合并(改错)!

  • 打开dev.txt:vim dev.txt,查看内容如下:

    可以发现,Git 已经提示了冲突的位置!

    <<<<<<<HEAD 与 “====” 之间的是 main 中的 changes

    “====” 与 >>>>>>bugFix 之间的是 bugFix 中的 changes

    我们可以依据实际的 API 改变情况进行修改!如下

  • 之后,可以用 git add 要告诉 Git 文件冲突已经解决

    注意:branch 的状态由 (main|MERGING) 变为了 main,说明 merge 完成!

    查看 dev.txt 内容:已经变成了我修改(协商)后的内容

  • 对于 bugFix 分支,这时可以删除了!
Donate comment here.