# 1 简明指南

创建新仓库:git init

检出仓库:git clone /path/to/repository 创建一个本地仓库的克隆版本。

工作流:工作目录、暂存区 index、HEAD

添加到暂存区:git add <filename>, git add *,git add .

提交到 HEAD:git commit -m "代码提交信息"

推送改动:git push origin <branchname> 将 HEAD 推送到远端仓库。

连接服务器:git remote add <servername> <server>

分支:master 是默认分支。

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是"默认的"分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

创建分支并切换:git checkout -b feature_x

切换分支:git checkout master

删掉分支:git branch -d feautre_x

更新本地仓库:git pullfetchmerge 远端的改动。

git fetch <alias> <branch> 将远程主机的最新内容拉到本地。

取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息

git log -p FETCH_HEAD

git merge <alias/branch>

          A---B---C feature
         /
D---E---F master
1
2
3

将分支合并到当前分支中。

          A---B---C feature
         /         master
D---E---F
1
2
3

--no-ff 会让 Git 生成一个新的提交对象,禁止快进式合并。

git merge --no-ff -m "xxx" <alias/branch>

          A---B---C feature
         /         \
D---E---F-----------G master
1
2
3

--no-ff 禁止了快进,所以会生成一个新的提交,master 指向 G。

git pull 相当于:git fetch origin main; git merge FETC_HEAD

要合并到其他分支,执行:git merge <branch>

如果有冲突,手动合并,并使用 git add <filename> 标记合并成功。

git diff <source branch> <target branch> 预览差异。

只要不与 origin 服务器连接,origin/master 指针就不会移动。

标签:git tag 1.0.0 1b2e1d63ff 创建一个 1.0.0 的标签。

获取提交 id: git log

查看所有分支:git branch -a git branch -av 查看所有分支+上次提交的信息

"A Dog" = git log --all --decorate --oneline --graph

git log --all --decorate --oneline --graph

--oneline 	日志单行显示
--graph		分支图显示
--decorate 	可显示分支名称
--all		显示所有分支
1
2
3
4
5
6

替换本地改动:git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。

已添加到暂存区的改动以及新文件都不会受到影响。

如果想丢弃本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:

git fetch origin

git reset --hard origin/master

查看仓库当前的状态,显示有变更的文件:git status

将文件从暂存区和工作区删除:git rm

生成 SSH keys:

$ ssh-keygen -t ed25519 -C "your_email@example.com"

设置 username 和 email:

$ git config --global user.name "your name"
$ git config --global user.email "your_email@youremail.com"
1
2

# 廖雪峰 git 教程

git init 初始化版本库。

git add 文件名 把文件添加到暂存区。

git commit -m "提交消息" 把文件提交到 HEAD

git commit --amend 修改上一次提交、补充提交(将暂存区的一起合并入上次提交)。

git status 显示工作树状态。

git diff 查看尚未缓存的改动 。

git diff --cached 查看已缓存的改动。

git diff HEAD 查看已缓存的和未缓存的所有改动。

git rm [-r] --cached 文件名 从暂存区删除文件(夹),不会删除本地文件。

git rm --cached . 清空暂存区。

git log --oneline --graph --decorate --all 查看提交日志。

HEAD 表示当前版本,即最新的提交。HEAD^ 上一个提交。HEAD^100,往上 100 个版本。

git reset --hard HEAD^ 退回到上一个版本。

git reset --hard 1094a 退回到指定版本。

回退版本时仅仅是更改 HEAD 指向,然后更新工作区。

git reset --mixed commitid,默认,将指定 commit id 撤回之后所有内容全部放进工作区中。

git reset --soft commitid,取消之前的提交,并将取消的更改保留在暂存区。

git reset --hard commitid,将指定 commit id 撤回并清空工作区及暂存区所有修改。

git reflog 查看历史命令。

工作区、暂存区、版本库。git add 把所有要提交的修改放到暂存区。git commit 把所有暂存区的修改提交到版本库。

git reset HEAD 文件名 把暂存区的修改撤销掉,回滚。

git rm 从本地中删除文件。

git checkout -- 文件名 用版本库的文件还原工作区的版本。从来没有添加到版本库的文件,是无法恢复的。

ssh-keygen -t rsa -C "youremail@example.com" 创建 SSH Key。

git remote add origin git@github.com:xxxxxx/xxx.git 添加远程库。

远程库名字就是 origin。

git push origin master 把当前分支 master 推送到 origin。

git push origin main --force 强制用本地仓库覆盖远程仓库。

git remote -v 查看远程库信息。

git remote rm 库名 删除库。

git clone git@github.com:xxx/xxx.git 克隆一个本地库。

主分支,master 分支。

git checkout -b dev 创建并切换到 dev 分支。

相当于:

git branch dev
git checkout dev
1
2

切换到分支 dev 然后提交修改后,切换分支将无法看到修改。

git merge 分支名 合并分支。(默认Fast forward)。

git merge --no-ff -m "提交信息" 分支名 不使用 Fast forward。

git branch -d 分支名 删除分支。

git push origin -d 分支名 删除远程分支。

git 鼓励使用分支完成某个任务,合并后删除分支。

合并分支后可能存在冲突,修改冲突后重新提交合并即完成。

git 使用 Fast forward 模式删除分支后会丢掉分支信息。

分支策略

main 分支应该是稳定的,用来发布新版本,平时不在上面干活。

dev 分支用来开发。需要发布版本时,再把 dev 分支合并到 main 分支。

每个开发者都有自己的分支,基于 dev 分支开发。

git stash 将未提交的修改(工作区的修改和暂存区的修改)暂时储藏起来。

git stash pop 将之前储藏的修改取出来。

git cherry-pick 4c805e2 复制一个特定的提交到当前分支。

修复 bug 时,会创建新的 bug 分支进行修复,然后合并,删除。

如果有工作未完成,可以保护现场,然后修复 bug,修复后,git stash pop 回到工作 现场。在其他分支修复的 bug,想要合并到 dev 分支,可通过 git cherry-pick <commit> 命令复制,避免重复劳动。

添加一个新功能,最好新建一个 feature 分支,完成后合并,最后删除分支。

删除一个未合并的分支,使用:

git branch -D feature 强制删除 feature 参数。

推送分支:git push origin dev

main 分支是主分支,因此要时刻与远程同步。

dev 分支是开发分支,团队所有成员在上面工作,也需要与远程同步。

bug 分支只用于在本地修复 bug。

feature 分支是否推到远程,取决与是否需要合作。

抓取分支

git clone git@github.com:xxx/xxx.git 只会抓取 main 分支。

git checkout -b dev origin/dev 抓取远程 dev 分支。

多人协作的工作模式:

  1. git push origin <分支>,远程仓库同步到本地版本库,不会影响工作区。
  2. 推送失败,则合并,git fetchgit merge
  3. 合并有冲突,则解决冲突,在本地提交。
  4. 解决冲突后 git push origin <分支>
  5. 如果本地分支和远程分支的链接关系没有建立,则 git branch --set-upstream-to <分支> origin/<分支>

变基:git rebase 合并 commit 成直线。

git rebase -i commit-idgit rebase -i HEAD~n 合并多次提交,并在交互式界面处理编辑完成操作。

git rebase -i [startpoint] [endpoint],指定一个合并区间 startpoint 和 endpoint,注意:该区间指定的是一个前开后闭的区间,意思就是startpoint不参与合并。如果不指定endpoint,则该区间的终点endpoint默认是当前分支 HEAD。

创建标签:git lag v1.0 在当前分支打标签。

git tag 查看所有标签。

git tag v0.9 f52c633 对某次 commit 打标签。

git tag -a v0.1 -m "xxx" 1094adb 创建带说明的标签。

git show <tagname> 查看标签说明。

git show commit-id --stat 显示提交中文件更改的统计信息。列出被修改、删除、新建的文件,并显示更改行数。

git tag -d v0.1 删除标签。

创建的标签都只存储在本地,不会自动推送到远程。

git remote show origin 查看 origin 地址。

git push origin <tagname> 推送某个标签到远程。

git push origin --tags 推送所有本地标签。

从远程删除标签:

  1. 从本地删除。

git tag -d v0.9

  1. 从远程删除。

git push origin :refs/tags/v0.9

git 打补丁:

Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。 .diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。 .patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。

git diff commit_sha1_id commit_sha1_id > diff文件名 指定 commit id 生成 UNIX 标准补丁文件。

git diff --cached 添加暂存区还未提交的内容。

git diff HEAD^..HEAD --binary > foobar.patch 包含二进制文件时的diff和apply。

git format-patch commit_sha1_id -n 某次提交(含)开始的 n 次提交。

git format-patch 2a2fb4 -1,指将 2a2fb4 这个提交生成 patchfile。

git apply patchfile 应用 patchfile 到当前分支。

git apply --stat patchfile 检查 patch 格式。

git apply --check patchfile 测试 patchfile 能否用于当前分支。

让 git 显示不同颜色:git config --global color.ui true

修改 git 默认编辑器 git config –global core.editor vim

在Git工作区的根目录下创建一个特殊的.gitignore文件, 然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

git check-ignore -v 文件名

检查哪个规则忽略了文件。

指定文件排除在 .gitignore 外:

!main.o

c.gitignore 文件示例:

.*
!.gitignore
# Prerequisites
*.d

# Object files
*.o
*.ko
*.obj
*.elf

# Linker output
*.ilk
*.map
*.exp

# Precompiled Headers
*.gch
*.pch

# Libraries
*.lib
*.a
*.la
*.lo

# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib

# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex

# Debug files
*.dSYM/
*.su
*.idb
*.pdb

# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf

**/bin/*
*.*~
obj/
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

搭建 git 服务器:

  1. 安装 git。
  2. 创建 git 用户,运行 git 服务。
  3. 创建证书登录。
  4. 初始化 git 仓库。
  5. 禁用 shell 登录。
  6. 克隆远程库。
sudo apt-get install git
sudo adduser git
# 把所有要登陆的用户的公钥,即 id_rsa.pub 文件,导入到
# /home/git/.ssh/authorized_keys 文件里,一行一个。
# 选定一个目录作为 git 仓库,如 /srv/sample.git
# 在 /srv 目录下执行命令:
# 创建裸仓库,没有工作区
sudo git init --bare sample.git
# 服务器上的 git 仓库通常以 .git 结尾,把 owner 改为 git
sudo chown -R git:git sample.git
# 编辑 /etc/passwd 禁用 shell 登录
git:x:1001:1001:,,,:/home/git:/bin/bash
# 改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
# git-shell 每次一登陆就自动退出。

# 克隆远程仓库:

git clone git@server:/srv/sample.git
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

合并一个或者多个提交到另一个分支:

git cherry-pick 82ecb31 合并指定提交到当前分支。

例如需要合并 dev 分支上的 commit1 ~ commit4 到 main

# 1 基于dev分支创建一个新的分支,并指定最后的commit_id:
git checkout -b newbranch commit_id4
# git rebase 这个新分支的 commit 到main(--onto)。
git rebase --onto main commit1^
1
2
3
4

Git 追踪文件是根据文件名来的,所以更改文件名需要使用命令:

git mv -v 文件重命名,并显示信息。

# 参考

最后更新: 2023/11/8 08:07:45