# git常用命令

## 分支

```
// 查看本地分支
git branch
// 查看远程分支
git branch -r
// 查看分支详细信息
git branch -vv
// 同步远程仓库
git fetch
// 创建分支dev
git branch dev
// 切换到分支dev
git checkout dev
// 删除分支dev
git branch -d dev
// 创建并切换到分支dev
git checkout -b dev
// 合并分支
git merge dev
```

## 远程分支

#### 创建远程分支

git push (远程仓库名) (分支名) 或

git push (远程仓库名) (本地分支名:运程分支名)

```
// 创建远程分支dev  
git push origin dev
// 或             
git push origin dev:dev
意思为取出本地的dev分支，推送到远程的仓库中的dev分支去。
```

#### 跟踪远程分支

从远程分支 checkout 出来的本地分支，称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push，Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样，在这些分支里运行 git pull 会获取所有远程索引，并把它们的数据都合并到本地分支中来。

```
git checkout -b [分支名] [远程名]/[分支名]

git checkout --track origin/dev

// 从远程分支dev创建本地分支feature
git checkout -b feature origin/dev
```

在克隆仓库时，Git 通常会自动创建一个名为 master 的分支来跟踪 origin/master。这正是 git push 和 git pull 一开始就能正常工作的原因。

```
// 将本地分支feature的远程分支设为orgin/dev
git branch --set-upstream-to=origin/dev
```

#### 删除远程分支

语法：git push [远程名] :[分支名]

```
// 删除远程分支dev
git push origin :dev
新
```

从仓库更新更新跟踪的远程分支

```
git pull
git pull origin
```

从远程分支master合并到当前分支

```
git pull origin master
```

相当于

```
git fetch origin
git merge origin/next
```

参考：Git-分支-远程分支

## 与Github同步

将本地的一个目录下的文件与Github上一个仓库相关联。

```
// 初始化本地
git init
// 增加远程仓库地址
git remote add origin git@github.com:Zhao-Hui-Huang/GitLearn.git
// 从远程仓库同步
git fetch
// 检出
git checkout --track origin/master

git add .
git commit -m'add test file'
git push
```

## Git 比较命令

```
// 比较工作区与暂存区的文件
git diff
// 比较暂存区与最后一次commit的文件
git diff --cached
// 比较工作区与最后一次commit的文件
git diff HEAD
```

## 常用命令

```
git status : 查看当前的提交状态
git merge 要合并的分支名称 : 合并分支
git reset HEAD testby : git add 后 撤销文件
git reflog : 查看所有操作的日志
git reset --hard HEAD : 版本回退
git stash : 讲文件放入暂存区
git stash list : 查看缓存区文件
git stash applly 缓存区id : 将指定的文件从缓存区拿出来
git stash pop : 将文件从缓存区拿出来,并删除缓存区的文件
git stash clear : 清除缓存区
git push origin 标签名称 : 推送标签到远程仓库
git push origin --tags : 推送所有的标签到远程仓库
git pull origin master --allow-unrelated-histories //把远程仓库和本地同步，消除差异
```

## 拉取推送的命令

```
git pull [主干|分支]：拉取
git add 文件名称：追踪指定的文件
git add .(注意这里有一个点) ：追踪所有的文件
git commit -m “注释”：提交到本地仓库
git push [主干|分支]：推送到远程仓库
```

git拉取远程代码

```java
git clone  https://xxx.git
```

git拉取远程指定分支下代码（-b 分支名称）

```java
git clone -b v2.8.1 https://xxx.git
```

初始化一个本地仓库，在同级目录下会出现一个隐藏的.git文件

```csharp
git init
```

查看git的配置信息

```csharp
git config -l
```

git配置本地仓库的userName（必须）

```csharp
git config user.name 'Lee'
```

git配置本地仓库的邮箱（必须）

```csharp
git config user.email '12345@qq.com'
```

三级文件配置路径：

```csharp
 .git/config 

/.gitconfig    #当前用户目录 

/etc/gitconfig  #git安装目录
```

本地提交到git索引（缓存）中

```csharp
git add .          #把新增的、修改的都加到缓存

git add -A        #把新增、和修改的、和删除的都加到缓存
```

本地从缓存中加到文件库（repository）中

```csharp
git commit -m '版本描述'  #提交到文件库
```

本地一件提交到文件库中

```csharp
git commit -am '版本描述'   #一步完成提交
```

查看当前git状态信息（查看是否有文件未提交）

```csharp
git status
```

git中的三类文件

```csharp
被追踪的（tracked）:已经加入文档库

不被追踪的(untracked):没有加入文档库

忽略的(ignored):忽略那些不需要管理的文件夹或文件　
```

git新建忽略文件 目录下建立一个.gitignore文件(可以有多个，影响范围当前文件及子文件)

```csharp
touch .gitignore　
```

.gitignore文件忽略内容demo

```csharp
# Maven #
target/

# IDEA #
.idea/
*.iml

# Eclipse #
.settings/
.classpath
.project　
```

注意：新建的一个忽略文件，为什么没有生效

答：可能是因为你的缓存区已经有忽略的文件了，所以需要先清空缓存区里的文件，重新add和commit操作

删除缓存区所有文件命令

```csharp
git rm -r --cached .   #主要这个点一定要写
```

重新add到缓存区

```csharp
git add .　
```

每一次commit都是一个提交点,唯一标识SHA1的ID，ID可使用前4至7个数字表示

查看git的日志信息

```csharp
git log
```

给提交点打标签 git tag -a v0.2 4a80f64(提交点SHA1的ID的前7位)

```
git tag -a tagV1 d819565b   #提交点SHA1的ID的前7位
```

回车之后会有输入tag内容的界面，然后像linux一样 点击 i 编辑  输入信息后 esc 然后 :wq 保存退出

简化git日志输出格式

```csharp
git log --oneline
```

显示主分支和自分支git日志 （前面会多个星号）

```csharp
git log --oneline --graph
```

查看本地添加了哪些远程分支地址

```java
git remote
```

 查看本地添加了哪些远程分支地址（详细）

```java
git remote -v
```

 删除本地指定的远程地址

```java
git remote remove origin　
```

添加远程地址

```java
git remote add origin https://xxxxxxxxxxxx.git
```

分支：分支意味着你可以从开发主线（master）上分离开，在不影响主线的同事继续工

```
git branch	                        #列出当前开发所有分支（默认会有master）
git branch king                   #创建一个king的分支（最新提交点）
git branch king 提交点          # 创建一个king的分支（指定提交点）
git branch -d -r <branchname>   # 删除远程分支，删除后还需推送到服务器git push origin:<branchname>  # 删除后推送至服务器
git branch -d king                #删除king分支
git checkout king                 #切换至king分支
git checkout master    
git merge king      #合并分支king和主干master，合并后的提交点属于主干master
```

![image-20230404102402667](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230404102402667.png)

本地分支重命名

```java
git branch -m <oldbranch> <newbranch> #重命名本地分支
```

查看本地和远程的所有分支

```java
git branch -a     # 查看本地和远程的所有分支
```

查看远程所有分支

```java
git branch -r # 查看远程所有分支
```

重命名远程分支：

1、删除远程待修改分支
2、push本地新分支到远程服务器

 head节点代表最新的commit 显示head 信息

```java
git show HEAD　
```

回退：git reset 选项 提交点(选项：--hard表示全恢复 提交点：可用ID或标签) 

```java
git reset --hard v0.1
```

 查询所有提交点

```java
git reflog   #回退后需要反悔的话，需要通过此命令查找到所有操作的提交点　　
```

合并分支的起始点(不推荐) 

```java
git checkout master    

git rebase reking       #合并分支reking和主干master，合并后的提交点属于主干master
```

 clone 克隆远程文件

```java
git clone "远程地址"  "本地文件名称"　　
```

push  推送本地修改分支至远程git仓库

```java
git push -u origin feature-wxDemo
```

fetch与pull

fetch是将远程主机的最新内容拉到本地，不进行合并

```java
git fetch origin master
```

pull 则是将远程主机的master分支最新内容拉下来后与当前本地分支直接合并 fetch+merge

```java
git pull origin master
```

如果远程分支是与当前分支合并，则冒号后面的部分可以省略。如下：

```java
git pull origin master:feature-wxDemo    #git pull <远程主机名> <远程分支名>:<本地分支名>
```

统计文件改动

```java
git diff --stat master origin/master  #git diff <local branch> <remote>/<remote branch>　
```

git分支说明

Production分支（主线分支用于发版，不会直接改）
Master分支，这个分支只能从其他分支合并，不能在这个分支直接修改

Develop分支（开发分支）
这个分支是我们是我们的主开发分支，包含所有要发布到下一个Release的代码，这个主要合并与其他分支，比如Feature分支

Feature分支（新功能分支）
这个分支主要是用来开发一个新的功能，一旦开发完成，我们合并回Develop分支进入下一个Release 

Release分支（偏向测试）
当你需要一个发布一个新Release的时候，我们基于Develop分支创建一个Release分支，完成Release后，我们合并到Master和Develop分支

Hotfix分支（紧急bug发布）
当我们在Production发现新的Bug时候，我们需要创建一个Hotfix, 完成Hotfix后，我们合并回Master和Develop分支，所以Hotfix的改动会进入下一个Release

比较本地分支与git 主分支差异情况

```java
git diff --stat feature-wxAgentIm origin/master  # git diff <local branch> <remote>/<remote branch>
```

git中一些选项解释（重要）：

```
-d
--delete：删除

-D
--delete --force的快捷键

-f
--force：强制

-m
--move：移动或重命名

-M
--move --force的快捷键

-r
--remote：远程

-a
--all：所有
```