Git使用小记

245 阅读8分钟

基本概念

  • 工作区:就是你在电脑里能看到的目录。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • 暂存区:英文叫stage, 或index。一般存放在 ".git" 目录下的index文件(.git/index),所以我们把暂存区有时也叫作索引(index)。
  • 远程库: Gitlab 或者 Github上的仓库

基本操作

git init

在当前目录初始化一个空的版本库,即.git文件夹,通过 ls -a 命令可以看到。

git add

将工作区的内容提交到版本库的暂存区

  • git add filename // 提交一个文件
  • git add directory // 提交一个目录
  • git add . // 提交整个工作区的文件

git commit

将暂存区的内容提交到本地的版本库(默认是master分支)

  • 1.git commit -m "add something to master dev" // -m 后面的内容是说明信息
  • 2.git commit --amend // 修改commit信息,但前提是还没有push

git status

查看当前分支的状态,文件是否add,commit或者delete(常用)

奇淫技巧:

  • git status --porcelain // 输出git add 或 git commit 的文件名
  • git status -s | cut -c4- // 输出改动过的文件名
  • git status --porcelain | grep -E 'M|A' | awk '{$1="";print $0}' | xargs // 输出改动过的文件名,并用一行展示

git log

查看当前分支提交(commit)的历史记录

  • git log --pretty=oneline --abbrev-commit // 查看简化版的历史记录
  • git log --graph --pretty=oneline --abbrev-commit // 查看图形化版的历史记录
  • git log --name-only -1 // --name-only 表示只显示文件名, -1表示查看一条
  • git log --oneline --name-only -1 // 简化版信息
  • git log --pretty=format:"" -1
  • git log --pretty=format:"" --name-only -1

git show

  • git show commit_id // 查看该commit做了哪些修改

git reflog

查看commit、reset、clone的历史记录(历史记录大全),可以找回丢失的commit

link:www.jianshu.com/p/8b4c95677…

git clone

把远程仓库的代码拷贝一份到当前目录,不需要在本地 git init

  • git clone git@xxxx.git // ssh方式
  • git clone https://xxx // https方式

git config

git config 用于配置用户名,命令别名等信息。

全局配置

  • git config user.name --global xxx
  • git config user.email --global xxxx@email.com

单个项目配置

这种方式有利于本地配置多个Git帐号

  • git config user.name xxx
  • git config user.email xxxx@email.com

注:单个项目配置在该项目的 .git/config 目录会有对应的信息

将https://替换成git://(Golang)

  • git config --global url."git@github.com:".insteadof "github.com/"

配置命令别名

www.jianshu.com/p/e5ed3a29a…

git push

git push <远程主机名> <本地分支名>:<远程分支名>

把本地代码提交到远程仓库,一般push前需要通过pull命令先把远程仓库的代码与本地代码进行合并,避免推送到远程仓库产生冲突。

1.git push origin master
这是比较常见的命令,意思是把本地master分支代码提交到远程仓库,并与远程master分支合,origin是因为git默认把远程仓库命名为origin。

如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

2.git push origin :master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支

3.git push origin
如果本地分支和远程分支存在追踪关系,则两者都可以省略

4.git push
这表示如果当前分支只有一个追踪分支,那么主机名都可以省略

5.git push -u origin master
-u 表示指定origin为默认主机(因为可能存在多个远程库)

注:master只是分支名,使用时可根据需要替换为其他分支

git pull

git pull <远程主机名> <远程分支名>:<本地分支名>

把远程代码下拉到本地,并与本地代码进行合并。注意这里是远程分支在前面。

1.git pull origin master
把远程master分支的代码与本地代码进行合并

2.git pull origin dev:master
把远程仓库的dev分支与本地master分支合并

注: git pull 其实相当于 git fetch + git merge(先取回代码再合并)

git fetch

从远程仓库取回(下拉)新的代码或者新的分支到本地,不会与当前代码进行合并

git fetch <远程主机名> <分支名>

1.git fetch
取回远程主机所有分支的更新(有时候别人推了一个新分支,用pull不一定能找到)

2.git fetch origin master
取回远程主机master分支的更新, 此时本地代码并未受影响,且在.git目录会多出一个FETCH_HEAD指针, 这时执行 git merge origin/master 便可将代码进行合并(注意不是origin master)

3.git fetch origin master:temp
本地新建一个分支temp,从远程的origin仓库的master分支下拉代码到temp分支,更安全

HEAD、FETCH_HEAD指针理解

  • HEAD: 指向最近的一次commit
  • FETCH_HEAD: 指向最近一次的fetch
  • ORIG_HEAD: 指向合并后的分支
  • MERGE_HEAD:指向合并前的分支

参考:
blog.csdn.net/transMaple/…
blog.csdn.net/claroja/art…

git merge

用于代码的合并。

如果合并后有冲突,解决冲突后,需要通过 git commit 命令结束合并。

如果合并后有冲突,想终止合并,可使用 git merge --abort 命令。

git rebase

git rebase有两个常见用法,一是通过rebase命令合并多个commit;二是类似merge命令,对代码进行合并,与merge不同的是,merge合并后会生成一个新的commit,而rebase是将之前的commit应用到你的分支上,所以并不会产生新的commit

关于merge和rebase的区别,可查看这里(图解):
gitbook.liuhui998.com/4_2.html

关于rebase合并多个commit,可查看这里:
juejin.cn/post/684490…

注: git rebase -i a027673196c210 //合并这个commit之前的所有commit,不包括此次commit

git cherry-pick

这个命令的作用是将分支A的某次commit合并到分支B上。

比如从master分支检出分支A, 分支A在本地commit后, 记下commit id; 切换到本地master分支, 执行 git cherrypick commit_id, 可将分支A此次commit的内容合并到master分支上。

git remote

  • 1.git remote // 列出所有远程主机
  • 2.git remote -v // 列出所有远程主机及其对应的网址
  • 3.git remote add origin git@github.com.xxx.git // 将本地仓库与远程主机关联
  • 4.git remote rm origin // 取消本地仓库与远程主机的关联,这个操作一般用于更换远程版本库的时候。比如我想把项目提交到git@gitlab.com.xxx.git, 而不是之前的github.com。
git remote rm origin

git remote add origin git@gitlab.com.xxx.git
  • 5.git remote rename <原主机名> <新主机名> // 用于远程主机的重命名

git branch / git checkout

  • 1.git checkout -b newBrach origin/master // 检出分支,名字为newBranch,内容与 origin/master 分支一致
  • 2.git branch // 查看所有分支
  • 3.git branch -r // 查看所有远程分支
  • 4.git branch -m 原分支名 新分支名 // 修改分支名字
  • 5.git branch -d 分支名 // 删除分支
  • 6.git branch newBranch tag_name // 根据标签创建分支

我们上面常提到,git clone 代码库时会在本地分支和远程分支建立一种追踪关系(tracking), 那么可不可以手动指定呢?肯定是可以的,比如我们下面的命令就是将本地master分支与远程dev分支绑定

git branch --set-upstream master origin/dev

git reset

git reset 一般用于版本回退,比如你有一天没睡好,对着代码乱改一通并commit了,等补完觉了想把代码回退到之前的版本,这时git reset就派上用场了。

在谈此命令之前,还需谈一个HEAD指针,HEAD指针的作用是指向当前分支,也就是我们在分支上看见的那个 * 号,比如我们现在有三个commit, 要从commit3回退到commit2,实际上就是将HEAD指针移到commit2而已。

git reset有三种方式:

  • 1.git reset --mixed commit2:默认方式,它回退到某个版本,只保留源码,回退commit和index信息
  • 2.git reset --soft commit2:回退到commit2,本地的源码也会变为上一个版本的内容, commit3内容不会丢失
  • 3.git reset --hard commit2:回退到commit2,本地的源码也会变为上一个版本的内容, commit3内容会丢失

注意,版本回退还分为几种情况:
1.本地修改,但是未提交到暂存区, 即未git add
注意,本地修改不包括 "新增文件,想通过回退撤销新增的文件" 的这种操作。

git checkout -- filename

2.本地修改,并提交到暂存区,即 git add

git reset filename

3.本地修改,并提交到本地版本库,即 git add + git commit

git reset --soft HEAD^ // HEAD^表示上一个版本, HEAD^^表示上上版本, HEAD~10表示前10版本

git tag

标签一般是commit之后才打的,作用是作为一个版本标识

  • 1.git tag // 查看当前标签
  • 2.git tag v0.0.2 // 为当前commit打标签
  • 3.git tag v0.0.2 -m "note" // 为当前commit打标签, 并做标注
  • 4.git tag v0.9 f52c633 // 为之前的commit打标签, f52c633是commit id
  • 5.git tag -d <tag> // 删除某个tag
  • 6.git push origin <tag> // 将某个tag推送到远程仓库

.gitignore 编写

编写 .gitignore 时注意注释不能在文件后面,比如 "test.md # 注释",这样是无法起到过滤的效果的。

# .gitignore 文件

test.md         // 过滤单个文件
*.md            // 过滤markdown文件
.idea/          // 过滤 .idea 文件夹
.idea/test/     // 过滤 .idea 文件夹的子文件夹test
**/.idea        // 过滤所有 .idea 文件夹

git fork

www.jianshu.com/p/b461fbf0a…

git的管理实践

www.ibm.com/developerwo…

总结如下:

单主干:

  • Master分支, 新功能直接合到Master

Github Flow:

  • Master分支,新功能通过新分支的形式合到Master分支

Git Flow:

  • 五类分支

Gitlab Flow:

  • master(开发分支) + production(生产分支)
  • 在master进行开发,确认要发版了再把内容合并到production分支
  • 大版本建议再拉出一个新的分支

gitlab项目同步到码云

blog.csdn.net/csnd_ayo/ar…

参考教程

廖雪峰Git教程
通过pycharm使用git(图文详解)
Git远程操作详解
Git中tag标签的使用
gitignore 规则