Git使用笔记

Git的介绍

[toc]

1.1、什么是Git

Git 是一个开源的分布式版本控制系统。

  • 分布式 :

    • 你的文件可以存放在多个不同的系统(或者位置),相互之间来自于一个 原本,单个副本修改,不影响其他副本。
    • 但是可以通过从一个指定地方(比如Github,或者自己构建的gitlab)上传与拉取来获得更新。
  • 版本控制系统: 顾名思义

    • 相比于 集中式版本控制系统,他更小巧,更快捷,更方便。
    • 不依赖中央服务器,本质上继承了他的创造者的 一切皆文件的想法。
    • 其实他就是你随处可以带走的文件,只不过加了一套逻辑,可以配合Git来控制,从而进行版本控制。

1.2、Git的安装

Linux下安装

1
2
3
4
5
6
Linux 下使用如下命令安装
sudo yum install git //适用于 RedHat 系的 Linux
或者
sudo apt-get install git //适用于 Ubuntu 系的 Linux
或者
sudo apt-get install git-core //适用于 老版本 Ubuntu 系的 Linux

一般情况下当下的Linux都自带了 git

对于更多Linux的安装方法参考 http://git-scm.com/download/linux

Mac下安装

  • 使用homebrew安装
1
brew install git
  • 二进制安装程序。

官方维护的 OSX Git 安装程序可以在 Git 官方网站下载,网址为 http://git-scm.com/download/mac

Windows下安装

请直接前往 git官网 下载,辅之以图形界面工具(可以考虑fork),另外终端操作以后值得学习。

在win10 1709版本以上的,可以辅之使用 windows subsystem的Linux来配合使用

1.3、查看是否有git或者安装是否成功

查看git版本

1
git --version

Git的配置

[toc]

2.1、单词

  • config : 设置与查看 Git 外观和行为的配置变量
    • --system :
      • 对应/etc/gitconfig 文件,包含系统上每一个用户及他们仓库的通用配置。
    • --global :
      • 对应~/.gitconfig~/.config/git/config 文件,只针对当前用户。
    • --local :
      • 对应 .git/config,即当前使用仓库的 Git 目录中的 config 文件
    • --list : 列举配置
    • 每一个级别会覆盖上一级别的配置

2.2、语法

1
2
3
4
5
6
git config --local			//当前Git工作区的配置
git config --global //全局Git工作区的配置
git config --system //系统Git工作区的配置

git config --list //Git配置列举
git config --unset --local //Git配置重置

2.3、语义

Git最小化配置

  • 配置用户名与邮箱
1
2
3
4
5
git config --global user.name 'name'              //配置全局的 名称
git config --global user.email 'email@address' //配置全局的 邮件地址

// 比如 git config --global user.name 'leo'
// 比如 git config --global user.email 'leobod@eside.cn'
  • git 的 配置 分为
    • 当前工作区 --local
      • 当前工作区只对 单个Git工作区 有效
    • 全局 --global
      • 全局配置,对当前所有 Git有效,
      • 但是当工作区本身有 local 配置时,以 local 为准
    • 系统 --system

一般为了方便都是配置的 全局(global)配置,若没有配置,后期用户在使用git 时会提示要求你配置

Git 配置查看

1
2
3
4
5
6
git config --list
git config --list --global //--排名不分先后
git config --list --local

git config --global user.name //查看单条配置
git config --global user.email

查看配置及所在的文件

1
git config --list --show-origin

配置默认文本编辑器

1
git config --global core.editor vim

获取Git仓库

3.1、单词

  • clone

3.2、语法

1
git clone <address>

3.3、语义

克隆一个仓库

  • 最简洁指令
1
2
3
git clone https://gitee.com/leobod/GitGuide.git
或者也可以使用 git:// 协议或者使用 SSH 传输协议
git clone git@gitee.com:leobod/GitGuide.git
  • 克隆并指定文件名
1
git clone https://gitee.com/leobod/GitGuide.git GGuide

git理解图示

Git 基础

5.1、单词

  • init
  • add
  • commit

5.2、语法

Git的初始化

1
2
git init					        //将当前目录 初始化成 Git仓库
git init <project_name> //在当前目录下 创建 project_name 的目录 并初始化成 Git仓库

Git添加文件到暂存区

1
2
3
4
git add <path/file>			//Git 初始化后 使用 add 来 将file添加到暂存区
git add -u //Git 添加 中所有tracked文件中被修改过或已删除文件的信息
git add -A //Git 添加 所有文件中被修改过或已删除文件的信息 和 未追踪的文件
git add -h //Git add 帮助说明

Git 提交文件到 版本库

1
2
3
4
5
6
7
8
git commit -m 'tips_message'	//Git 将暂存区修改 提交到版本库 并给commit标识 提示语
git commit -am 'tips_message' //Git 将所有修改的文件 提交到版本库,不管是否添加到暂存区
等同于
git add -a
git commit -m 'tips_message'

git commit -h //Git commit 帮助信息
git commit --amend //将最近的修改 附加到 最近一次的 commit 上

5.3、语义

创建一个Git仓库,初始化并提交一些commit

1
2
3
4
5
cd /path/……/project_01			//shell 下切换到 指定目录(根据具体情况)
git init //Git 仓库初始化
vi README.md //vi 新建或编辑一个 文件
git add README.md //添加 README.md 到 暂存区
git commit -m 'Write a README to introduce the project!' //提交修改到 版本库
1
2
3
4
5
或者
cd /path/……/ //shell 下切换到 指定目录(根据具体情况)
git init project_02 //Git 仓库初始化
vi README.md //vi 新建或编辑一个 文件
git commit -am 'Write a README to introduce the project!' //提交修改到 版本库

Git 状态查看

6.1、单词

  • version
  • status
  • log

6.2、语法

查看Git版本

1
git --version

查看 工作区 暂存区文件状态

1
git status

查看 commit 历史记录

1
2
3
git log
--oneline //一条 commit 在一行显示
--graph //显示 路径 线条

6.3、语义

查看 本机git 版本号

1
git --version

结果:

git version 2.17.1

查看 工作区 暂存区文件状态

1
git status

结果1:

On branch master

Your branch is up to date with ‘origin/master’.

nothing to commit, working tree clean

// 当前 处于 master 分支。分支具体请查看分支管理

// 你的分支 已经是最新的了, 包含了远端分支,若未连接Github 一般无这条提示

// 没有什么克提交的, 工作区 暂存区 无变化

结果2:

On branch master

No commits yet

Untracked files:
(use “git add…” to include in what will be committed)

    README.md

nothing added to commit but untracked files present (use “git add” to track)

// 当前分支 master

// 还没有 commit

//为追踪的文件 有 README.md 可以使用 git add来添加 到 暂存区

结果3:

On branch master

No commits yet

Changes to be committed:
(use “git rm —cached…” to unstage)

    new file:   README.md

// 当前分支 master

// 还没有 commit

//新的改变 等待提交, 如果想 取消,可以使用 git rm —cached从 暂存区中移除 指定文件

// 若没有问题 在合适的时候 可以 使用 git commit 来提交到 版本库

查看 commit 的日志 方式1

1
git log

结果:

commit 58a8145557cab8a08eedc0877f6fabe419fa84d9 (HEAD -> master, origin/master, origin/c1, origin/HEAD, c1)
Author: leobod 13952348337@sina.cn
Date: Fri Feb 8 20:56:01 2019 +0800

Git的介绍与安装,以及简单配置

commit efddeada1f93ba9a822ac208cfdf4915b6d406c2
Author: leobod 13952348337@sina.cn
Date: Fri Feb 8 19:10:43 2019 +0800

修改GitGuide的README.md,来说明如如何学习与记录Git的使用

commit 920f45c5909c33b49f0da5eba413c02d8d85faee
Author: leobod 13952348337@sina.cn
Date: Fri Feb 8 15:52:09 2019 +0800

Git 使用指南的 书写格式

commit cb5b26d8271c1fe4871094b66b8f7469e3c59859
Author: 差三岁Lee 13952348337@sina.cn
Date: Thu Jan 10 13:54:05 2019 +0800

Initial commit

// commit 后跟 提交的 hash 值,后期可以 使用 前 7位值来定位, 也可以多选 几位, 一般 7位就够

//Author 显示 commit 的提交是谁,以及邮箱号,用于对 commit 有问题 或疑问时,责任到人,一般在本机都是 用户 在 git config 处设置的值,如果没有设置,每次提交时 都会 提示要求输入

// Date 后跟 这个提交的日期

查看 commit 的日志 方式2

1
2
git log --oneline --graph
// --oneline与 --graph 可以单独使用

结果:

  • 58a8145 (HEAD -> master, origin/master, origin/c1, origin/HEAD, c1) Git的介绍与安装,以及简单配置
  • efddead 修改GitGuide的README.md,来说明如如何学习与记录Git的使用
  • 920f45c Git 使用指南的 书写格式
  • cb5b26d Initial commit

//一条 commit 缩在 一行 前7位显示 commit的 hash值,后面跟 <分支名称> 在跟

  • 号 其实 在终端一般 显示为 * ,在图形端一般是 平滑的线条连接,

    此处 分支都在一条线上,理论上多分支时,可以向树 (或者 森林)一样延展,多数情况下是树,一般不建议搞成 <森林>

何为 树 何为 森林 请 查看数据结构 树的相关内容。

Git 状态重置 或者 回滚

7.1、单词

  • reset
  • checkout
  • HEAD HEAD^ HEAD~n

7.2、语法

git 工作区还原到 暂存区的状态,也就是说 取消最近新添加的文件修改

1
2
3
4
5
git checkout .							//还原工作区 <所有> 文件 为暂存区状态暂存区状态

git checkout -- filename //还原工作区 <指定> 文件 为暂存区状态暂存区状态

补充说明:暂存区状态(最近一次commit 或者 暂存区回滚到的 commit 状态)

git暂存区 恢复到 commit 状态

1
2
3
4
5
6
7
8
9
10
11
git reset HEAD							// 恢复暂存区到 HEAD 指针指向的位置
git reset HEAD^ // 恢复暂存区到 HEAD 的上一次 commit
git reset HEAD~4 // 恢复暂存区到 HEAD 的上第4次 commit

git reset <hash> // 恢复暂存区到 指定hash commit处

git reset 缺省值为 mixed //将HEAD reset 没有修改 工作区 但是修改了 暂存区

git reset --soft //将HEAD reset 没有修改 工作区 与 暂存区

git reset --hard //将HEAD reset 同时修改工作区与暂存区

git reset 后 git log 只显示到 HEAD commit 处,以往的不显示,但是 可以到 项目的 .git/logs/refs中去寻找 一般记录保存 30天

找到后可以 使用 git reset,来重置

7.3、语义

单线型 版本迭代演进 与回滚演示

演示前的准备

  1. git init Test 初始化 一个Test 用于 git 演示

  2. 建立 hello.c文件 用于版本迭代

  3. git ad hello.cgit commit -m ‘Write a Hello World C Language file'

  4. git log --oneline 结果:

    1
    b2e1368 Write a Hello World C Language filWrite a Hello World C Language fil
  5. vi hello.c 在文件里面 return 0 前 补充 getchar() 并提交

  6. git log --oneline 结果:

    eb96dee At the end insert getchar() to make a wait
    b2e1368 Write a Hello World C Language fil
    
  7. vi hello.c 在文件里面 补上 // Author: XXXX 提交

  8. git log --oneline 结果:

1
2
3
550f417 (HEAD -> master) insert author information into the file
eb96dee At the end insert getchar() to make a wait
b2e1368 Write a Hello World C Language fil


修改开始

代码最初为:

1
2
3
4
5
#include 'stido.h'
int main() {
printf('Hello World! \n');
return 0;
}
  1. 当前 hello.c 源码 如下:

  2. ```

    include ‘stido.h’

    // Author: Leobod
    int main() {

        printf('Hello World! \n');
        getchar();
        return 0;
    

    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    3. 修改后

    4. ```
    #include 'stido.h'
    // Author: Leobod
    // Description: A C language demo
    int main() {
    printf('Hello World! \n');
    getchar();
    return 0;
    }

    情况1

    若 使用 git checkout . 或者 git checkout -- Hello.c 后 恢复到 2处样式

    情况2

    若 使用 git reset --hard b2e1368 恢复到 代码最初样子 且 工作区 暂存区代码都一样

    git log

    1
    b2e1368 Write a Hello World C Language fil

    可以使用 git reset --hard 550f417 返回 最后一次修改状态

    找不到 hash 请前往 .git/logs/refs 中寻找

    情况3

    若使用 git reset b2e1368 工作区 代码 仍为 4处 样式, 暂存区与版本库为 代码最初样式

    此时 使用 git status 可以发现提示

    若想 工作区也 还原 多执行一步 git checkout .

    回到 最新状态 依然是 git reset 550f417

    此处 550f417 对应最后一次commit的 hash 值

本文部分内容参考引用了 Domon-Git Reset 三种模式

Git Diff 差异分析

虽然命名交 Git diff 但是实际上 diff 可以是一个单独的工具,专门用来进行 文本比较

diff 是Linux 自带的命令,同样 git 中也集成了这个命令

命令格式:

diff <参数> <文件1或目录1> <文件2或目录2>

详情可以参考 菜鸟教程—Linux diff 或者参考 博客园中的信息

git 的 diff

1
2
3
4
5
6
7
8
9
10
11
git diff 谁 与 谁 比较
git diff --cached //省略HEAD HEAD与暂存区比较
git diff //工作区 与暂存区 比较
=diff --git a/ b/

假定:HEAD、缓存区、工作区中的readme.md文件内容均不相同。
git diff HEAD -- readme.md //工作区 <===> HEAD
git diff -- readme.md //工作区 <===> 缓存区
git diff --cached -- readme.md //缓存区 <===> HEAD

git diff <branch_name1> <branch_name2> -- <file_name> //分支 指定文件 比较

具体可以参考 Git-diff

Git 文件删除、重命名

9.1、单词

  • rm
  • mv

9.2、语法

1
2
git rm file							//删除指定文件,同时 实现 rm
git mv <old> <new> //修改 Git仓库 里面的文件名,会同时实现 mv

.gitignore的使用

[toc]

.gitignore配置文件规则

在 .gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:

1
2
3
*.log
*.temp
/vendor

定义全局的 .gitignore 文件

除了可以在项目中定义 .gitignore 文件外,还可以设置全局的 git .gitignore 文件来管理所有Git项目的行为。

1
git config --global core.excludesfile ~/.gitignore

Git 忽略规则优先级

在 .gitingore 文件中,每一行指定一个忽略规则,Git 检查忽略规则的时候有多个来源
优先级如下(由高到低):

  • 从命令行中读取可用的忽略规则
  • 当前目录定义的规则
  • 父级目录定义的规则,依次地推
  • $GIT_DIR/info/exclude 文件中定义的规则
  • core.excludesfile中定义的全局规则

Git 忽略规则匹配语法

在 .gitignore 文件中,每一行的忽略规则的语法如下:

  • 空格 不匹配任意文件,可作为分隔符,可用反斜杠转义
  • # 开头 的模式标识注释,可以使用反斜杠进行转义
  • ! 开头 的模式标识否定,该文件将会再次被包含,
    • 如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
  • / 结束 的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
  • / 开始 的模式匹配项目跟目录
    • 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
  • **匹配 多级目录,可在开始,中间,结束
  • ? 通用匹配单个字符
  • [] 通用匹配单个字符列表

.gitignore常用规则

常用匹配示例:

1
2
3
4
5
6
7
8
9
bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 忽略根目录下的bin文件
/*.c: 忽略 cat.c,不忽略 build/cat.c
debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo: 忽略/foo, a/foo, a/b/foo等
a/**/b: 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
*.log: 忽略所有 .log 文件
config.php: 忽略当前路径的 config.php 文件

.gitignore常用规则-JAVA

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
# Operating System Files

*.DS_Store
Thumbs.db
*.sw?
.#*
*#
*~
*.sublime-*

# Build Artifacts

.gradle/
build/
target/
bin/
dependency-reduced-pom.xml

# Eclipse Project Files

.classpath
.project
.settings/

# IntelliJ IDEA Files

*.iml
*.ipr
*.iws
*.idea

.ignore规则配置-C++

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# User ================================
# 用户自定义的其他忽略文件

# Clion ================================
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

# vscode ================================
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

# C++ ================================
Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app


# CMake ================================
bin/
build/
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake

Git 分支管理

10.1、单词

  • branch
  • checkout
  • merge

10.2、语法

Git 分支建立与切换

1
2
3
4
5
git branch <branch_name>			//建立分支
git checkout <branch_name> //切换到 branch_name 的分支

等同于
git checkout -b <branch_name> //新建 并切换到 branch_name 的分支

Git 已有分支查看

1
2
3
4
git branch							//查看分支
git branch -v //查看每一个分支的最后一次提交
git branch -a //查看所有分支 ,包含 远端分支
git branch -av //查看所有分支 以及 最后一次提交

Git分支删除

1
2
git branch -d <branch_name>			//删除 指定分支
git branch -D <branch_name> //强制删除 指定分支,删除分支并丢掉所做的修改

Git 分支合并

1
2
git checkout master					//切换到分支 master
git merge <branch_name> //将指定分支 的修改 合并到 master 上

情景1: Git的常见分支处理方案

前置状态

现在有一个 Git仓库, 里面有 README.txt 文件 和 description.txt 文件

README.txt 文件内容

1
This is the first line in the README.txt

description.txt 文件为空

有如下分支

  • master
  • feature
  • develop

11.1、操作方案1—不同分支处理了同一个文件,合并时产生冲突的处理

开始时 master <==> feature <==> develop (3个分支处于同一处)

切换到 feature 分支

修改 read.txt 文件为
1
2
This is the first in the read.txt
in the feature branch

commit 2

                    commit1        commit2

修改后 init —————> master(develop)—————> feature

切换到 develop 分支,并保证工作区 与 初始状态一样

修改 read.txt 文件为
1
2
This is the first in the read.txt
In the develop branch

commit3

                    commit1        

修改后 init ————> master————> feature[处于commit2]

                    |

                    |

                    ----------------> develop[处于commit3]

最后 切换到 master分支,并保证 工作区与 版本库一致(也就是最初始状态)

此处先 合并 develop 后合并feature (也可以 先合并feature后合并 develop 效果一样)

git merge feature

git merge develop

出现冲突,处理冲突文件 read.txt

同一个文件合并时的冲突都合并到了文件中,git不辅助做修改,需要自行修改,修改文件后重新commit

1
2
3
4
5
6
This is the first in the read.txt
<<<<<<< HEAD
In the develop branch
=======
in the feature branch
>>>>>>> feature

方案1

修改后,假设此处2句都要可以改成

1
2
3
This is the first in the read.txt
In the develop branch
in the feature branch

git commit

方案2

修改后,假设此处可以改成 master

1
2
This is the first in the read.txt
In the dmaster branch

git commit

11.2、操作方案2—不同分支处理了不同文件,各分支间的修改相互独立没有修改到同一个文件

正常合并 (merge) 不会报出 冲突异常(conflict)。

11.3、操作方案3—不同分支修改了同一 文件的文件名

合并时报出 冲突异常

比如 read.txt 在分支 develop 改成 read1.txt

而另外一个人 操作 分支feature 时 将read.txt 改成了 read2.txt

这时 master 合并2个分支时 会出现异常,结果导致出现 read1.txt 与read2.txt 需要合理甄别,或者讨论后决定是 留住哪一个文件,还是都留下来,在 add 以及commit

Git 远程分支管理

12.1、单词

  • remote
  • clone

12.2、语法

git remote 操作

1
2
3
4
5
git remote -v					//查看远程信息
git remote add <name> <url> //添加 远程 同时可以指定 branch 以及其他
git remote rename <old> <new> //修改 远程 名称
git remote remove <name> //删除 远程 引用
……………………

git clone 操作

1
2
3
4
git clone [url/path]					
//从指定的 URL或路径 克隆仓库到本地
git clone --bare file:///path/……/project_name name.git
//将指定工程的版本库 克隆或者备份到 当前位置,不加--bare原样克隆

12.3、语义

不同克隆方法

1
2
3
4
git clone /path/…………/project.git				//哑协议 克隆
git clone file:///path/…………/project //智能协议 克隆
git clone http://github.com/name/progit.git //http协议 克隆
git clone git@github.com:leobod/GitGuide.git //SSH协议 克隆

克隆一个 github项目

1
2
3
4
5
6
git clone https://github.com/leobod/GitGuide.git		//克隆当前项目到本地
git remote -v
shell显示
origin git@github.com:leobod/GitGuide.git (fetch)
origin git@github.com:leobod/GitGuide.git (push)
克隆的项目 远程名一般为 origin 远端分支一般叫 origin/master 或者其他

使用远程自己 连接github项目

1
2
3
4
5
6
git remote add github https://github.com/leobod/GitGuide.git
git remote -v
shell显示
github git@github.com:leobod/GitGuide.git (fetch)
github git@github.com:leobod/GitGuide.git (push)
请类比上文

使用远端一般 需要提前配置好 SSH 密钥 并将公钥 放置于GitHub 中使得GitHub放行

更对内容请参考 GIt 官网 3.5 Git 分支 - 远程分支

git 本地远程同步操作

13.1、单词

  • fetch
  • pull
  • push

13.2、语法

1
2
3
git fetch						//从指定 远程 拉取文件到版本库
git pull //从指定 远程 拉取并合并到 版本库
git push //将版本库 推送到 远程仓库去

13.3、语义

在c0分支上做修改,并提交到远端,之后切换到master 合并c0分支的修改,再次提交

1
2
3
4
5
6
7
8
9
10
11
12
git clone https://github.com/leobod/GitGuide.git
cd GitGuide/
git checkout c1
vi README.md
做一些修改
git add --all
git commit -m 'message'
git push --set-upstream origin c1

git checkout master
git merge c1
git push --set-upstream origin master

当其他人修改了 文件,或者当远端 fast-forword(快过本地时,也就是commit 在上一回基础上有变更而本地 还没获取远端更新时)

方案1:

1
git fetch origin				

方案2:

1
git pull origin

远程分支与本地分支映射关联

14.1、单词

  • —set-upstream-to
  • -u
  • —unset-upstream
  • -vv //此处是2个v

14.2、语法

添加本地与远程映射

1
2
3
4
5
6
7
8
9
git branch --set-upstream-to=origin/remote_branch local_branch  
//此处不是必须一一对应
也可以使用
git branch -u origin/remote_branch local_branch

但是一般 我们建立分支是在本地,提交也是在本地
所以做 push时候 一般已经指定了 如:
git checkout c1 //切换到c1 分支
git push --set-upstream origin c1 //当处于 c1 分支时,这样提交 就是 本地c1与远端c1关联

14.3、撤销分支关联

1
git branch --unset-upstream local_branch

查看所有分支的映射关系

1
git branch -vv					//此处是2个v

查看所有分支(本地加远端)

1
git branch -av

删除远程分支

1
git push origin --delete <remote_branch_name>

14.4、Git对版本库的文件取消track

取消track方法

1
git rm --cached file/dir

14.5、GIt远程其他操作

[toc]

14.5.1、Git远程仓库

此处关注的是remote,而不太侧重clone

添加远程

1
git remote add <name> <url>		//添加 远程 同时可以指定 branch 以及其他

查看远程

1
2
3
4
5
git remote -v

git remote show <name>
比如
git remote show origin

远程仓库的重命名

1
2
3
4
git remote rename <name> <new_name>
比如
git remote rename origin github
git remote rename origin gitee

远程仓库的移除

1
git remote remove origin

pull与push

1
2
3
git fetch						//从指定 远程 拉取文件到版本库
git pull //从指定 远程 拉取并合并到 版本库
git push //将版本库 推送到 远程仓库去

14.5.2、分支手动关联

1
2
3
git branch --set-upstream-to=origin/remote_branch local_branch  

git push --set-upstream origin <branch_name>