# 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 pull
,fetch
并 merge
远端的改动。
git fetch <alias> <branch>
将远程主机的最新内容拉到本地。
取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息
git log -p FETCH_HEAD
git merge <alias/branch>
A---B---C feature
/
D---E---F master
2
3
将分支合并到当前分支中。
A---B---C feature
/ master
D---E---F
2
3
--no-ff
会让 Git 生成一个新的提交对象,禁止快进式合并。
git merge --no-ff -m "xxx" <alias/branch>
A---B---C feature
/ \
D---E---F-----------G master
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 显示所有分支
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"
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
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 分支。
多人协作的工作模式:
git push origin <分支>
,远程仓库同步到本地版本库,不会影响工作区。- 推送失败,则合并,
git fetch
,git merge
。 - 合并有冲突,则解决冲突,在本地提交。
- 解决冲突后
git push origin <分支>
- 如果本地分支和远程分支的链接关系没有建立,则
git branch --set-upstream-to <分支> origin/<分支>
变基:git rebase
合并 commit 成直线。
git rebase -i commit-id
,git 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
推送所有本地标签。
从远程删除标签:
- 从本地删除。
git tag -d v0.9
- 从远程删除。
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/
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 服务器:
- 安装 git。
- 创建 git 用户,运行 git 服务。
- 创建证书登录。
- 初始化 git 仓库。
- 禁用 shell 登录。
- 克隆远程库。
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
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^
2
3
4
Git 追踪文件是根据文件名来的,所以更改文件名需要使用命令:
git mv -v
文件重命名,并显示信息。