git常用操作
Easul Lv6

常用流程

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 新建一个文件夹, 然后在该文件夹内初始化一个git仓库
git init
# 设置邮箱和用户名到本仓库
git config user.email "you@example.com"
git config user.name "YourName"
# 创建.gitignore来标注不需要提交的文件路径
vi .gitignore
# 添加所有路径中除了.gitignore的文件到暂存区
# 用的add指令是将工作区文件提交到暂存区,告诉git帮助管理该文件
# 最开始没有该文件,创建后再add就是从未跟踪状态到已暂存状态
# 有了该文件,修改后再add就是从未暂存到已暂存
git add *
# 提交改动到head(确定已经提交的内容)
# 是将暂存区文件提交到本地仓库,作为了一个版本
# 可以随时查看已经提交的版本
git commit -m "test"
# 连接到远端服务器
# 如果已经添加过remote,可以git remote set-url origin git@github.com:用户名/仓库名.git
# 如果端口不是22,可以写成ssh的形式,如下
# git remote set-url origin ssh://easul@127.0.0.1:8022/easul/java
git remote add origin https://你的token@github.com/用户名/仓库名.git
# 推送提交到head的改动到master分支
# push之前最好先pull一下,从而解决冲突
git push origin master

设置用户信息

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 需要设置邮箱和用户名, 去掉--global参数将只添加该用户信息到该仓库
git config --global user.email "you@example.com"
git config --global user.name "YourName"
# 查看用户信息
git config user.email
git config user.name

查看本repo连接的仓库连接

折叠代码块BASH 复制代码
1
git remote show origin

提交文件到暂存区的不同命令

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 添加工作文件或文件夹到暂存区(临时保存提交内容)
git add README.md mydir
# 提交除.gitignore外所有文件
git add *
# 提交所有更新文件
git add .

查看文件的修改状态

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 查看所有文件状态
# 创建了文件未提交会显示Untracked files,未跟踪
# 修改了文件未提交会显示Changes not staged for commit,改变未提交
# add后会提示No Commit yet
# commit后会提示工作树已经干净了
git status

仓库推送的不同方式

可以参考这里

仓库推送

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 完整命令
# git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名]]
# -f 表示强制覆盖
# --set-upstream 推送到远端的同时建立起本地分支和远端分支的关联关系
# origin 远程仓库名,在git remote时设置
# master 远端分支
# 这个完整写法是git push origin master:master
# 相当于把本地master推送到远端master
# 可以省略是因为分支名一样,不一样就需要用冒号隔开了
git push origin master

# 这样就可以绑定与远端分支的联系
# 先查看当前本地分支与远程分支联系
git branch -vv
git push --set-upstream origin master:master
# 推送后在查看,分支就会被绑定
git branch -vv
# 下次直接推送即可,因为已经指定了绑定关系
git push

仓库的获取方式

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 克隆远程仓库到本地仓库
git clone https://github.com/用户名/仓库名.git
# 克隆远程仓库到本地仓库的hellogit文件夹
git clone https://github.com/用户名/仓库名.git hellogit
# 克隆某个分支到本地
git clone -b hexo https://github.com/用户名/仓库名.git

仓库的抓取

将仓库的更新抓取到本地但不合并

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
# 抓取远程master分支
# git fetch [remote name] [branch name]
# origin git remote指定的远端仓库的名字
# master 远端仓库的分支
git fetch origin master
# 查看当前git日志
# 可以看到有个origin/master的分支,是远程分支
git log --all --pretty=oneline --abbrev-commit --graph
# 手动合并拉取的远程分支
git merge origin/master

仓库的拉取

抓取到仓库的更新后自动合并

折叠代码块BASH 复制代码
1
2
3
4
# origin  git remote指定的远端仓库的名字
# master 远端仓库的分支
# fetch之后还是可以pull,因为pull就是fetch + merge,所以也相当于fetch了两次
git pull origin master

拉取或抓取后的冲突解决

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 修改冲突文件
# <<<<<<< HEAD 到 =======是本分支的内容
# ======= 到 >>>>>>> dev是另一个分支的内容
# 决定好要哪个代码,然后删除不需要的内容就可以再次提交了
git add .
git commit -m "合并后的提交"

git设置代理

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
11
# 设置socks5, 取消--global将只添加代理到本仓库
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

# 设置http代理, 取消--global将只添加代理到本仓库
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080

# 取消添加的代理, 取消--global将只添加代理到本仓库
git config --global --unset http.proxy
git config --global --unset https.proxy

git查看配置

折叠代码块BASH 复制代码
1
2
3
4
5
6
# git查看系统配置
git config --system --list
# git查看当前用户配置
git config --global --list
# git查看当前仓库配置
git config --local --list

查看提交日志

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
# 查看的是commit的提交记录
# --all 显示所有分支
# --pretty=oneline 可以只显示commit id 和 commit message
# --abbrev-commit 使输出的commit id更短
# --graph 以图的形式显示
git log
git log --all --pretty=oneline --abbrev-commit --graph
# 查看所有分支操作记录,包括已经被删除的commit记录和reset的操作
git reflog

查看提交文件列表

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
# 每次修改的文件列表, 显示状态
git log --name-status
# 每次修改的文件列表
git log --name-only
# 每次修改的文件列表, 及文件修改的统计
git log --stat
# 每次修改的文件列表
git whatchanged
# 每次修改的文件列表, 及文件修改的统计
git whatchanged --stat

git查看最近提交的文件列表

查看提交内容

查看指定commitID下的提交记录

折叠代码块BASH 复制代码
1
2
3
4
# 查看提交记录,找到commitId
git log --all --pretty=oneline --abbrev-commit --graph
# 根据commitId查看提交内容
git show commitId

直接查看当前HEAD上的最近一次提交

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
# 第一种方法
git show
# 第二种方法
git log -n1 -p
# 第三种方法
# 显示最后 5 次的文件改变的具体内容
git show -5

commit message修改

commit后还没有push

折叠代码块BASH 复制代码
1
2
3
4
# 打开默认编辑器进行信息修改
git commit --amend --only
# 直接修改commit的信息
git commit --amend --only -m 'xxxxxxx'

commit后已经push

修改commit后再强制推送,不推荐这么做

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
# 先修改commit信息
# 打开默认编辑器进行信息修改
git commit --amend --only
# 直接修改commit的信息
git commit --amend --only -m 'xxxxxxx'
# 然后强制推送
git push -f origin master

commit用户名邮箱修改

折叠代码块BASH 复制代码
1
2
3
4
# 修改单个commit
git commit --amend --author "New Authorname <authoremail@mydomain.com>"
# 修改所有历史提交
# 参考git filter-branch相关命令

git版本回退

折叠代码块BASH 复制代码
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
# 1. 通过commitId回退到某个分支
# 从近到远显示提交日志,
# 加上--pretty=oneline可以只显示commit id 和 commit message, 会整齐一些
git log
# 回退到某个commit message的版本, 需要加上commit id回退
# --hard会让commit和代码都退回到原来的样子
git reset --hard commitId
# --soft只会让commit退回到原来的样子,代码不变
git reset –-soft commitId
# 然后即可推送旧版本
# 因为可能有人已经拉取了新版本,所以可能会有问题
# 最好是自己有自己的分支,那么就没问题了
# 2. 使用HEAD进行版本回退
# HEAD^n,表示第n个分支回退一步,第一个分支可以不写数字
# HEAD~n,表示在当前分支回退n步,回退一步可以不写数字
# HEAD^n~m,表示第n个分支后退m步
# 这里表示回退到当前分支的上一个commit的状态
git reset --hard HEAD^
# 3. 想要再推送回退版本后的新版本
# 可以如下找到commit id
git reflog
# 然后设为新版本即可
git reset --hard commitId
# 4. 创建新的commit撤销前一个commit的变化
git revert HEAD

HEAD^n和HEAD~n的区别
Git之版本回退
Git使用revert回滚

分支操作

可用于将工作从主线分离出去,用来修改bug,或者开发新功能
也可以用于不同开发人员开发自己的主线

创建查看分支

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看分支
git branch
# 创建新分支
# 新分支是从当前HEAD开始分支的,不是从最开始的空分支的
# git log --all --pretty=oneline --abbrev-commit --graph 中HEAD指向谁,谁就是当前分支
git branch dev
# 切换分支
# 切换后,目录中的文件是不同的,因为分支不同
git checkout dev
# 创建并且切换到分支
git checkout -b dev
# 查看本地分支和远程分支关系
# -vv 显示更加详细的分支信息
git branch -vv

创建空白分支

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
# 创建与当前分支无关的分支
git checkout --orphan newBranchName
# 需要再删除分支下的内容
git rm -rf .
# 然后再添加新内容
touch .gitignore
git add .gitignore
git commit -m 'Init an empty branch'

参考

合并分支

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
# 合并分支,一般都是其他分支合并到master
# 先切换到master
git checkout master
# 将dev的修改合并到master
# 如果修改的是不同的文件则自动可以合并
# 修改的同一个文件则合并冲突
git merge dev

删除分支

不能删除当前分支,只能删除其他分支

折叠代码块BASH 复制代码
1
2
3
4
5
# 删除分支时,做各种检查
git branch -d dev
# 不做任何检查,强制删除
# 因为可能分支提交了代码,还没有合并,所以不能强制删除
git branch -D dev

恢复分支

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 找到删除的分支commitId
git log --all --pretty=oneline --abbrev-commit --graph
# 通过该commitId将内容恢复到新分支
git branch newBranch commitId
# 查看当前有什么分支
git branch

冲突解决

查看这里

删除远程分支

折叠代码块BASH 复制代码
1
git push origin --delete my-branch

rebase

可以用于主线分支更新后,自己基于新的改变继续操作自己的feature开发

折叠代码块BASH 复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 0. 基于master已经开始了feature分支的开发
# 1. master有更新了,可以先拉取master的更新代码
git checkout master
git pull origin master
# 2. 然后在feature进行代码合并
git checkout feature
# 进行变基操作
# 这样就会将master最新的代码当做feature的基础
git rebase master
# 3. feature操作完之后,可以将代码合并到master,然后推送
git checkout master
git rebase feature
git push origin master
# ================================================
# 这样操作代码提交历史会更整洁
# 使用merge就会有更复杂的合并历史
# 所以可以代码编写阶段用rebase,提交时候用merge

git的rebase操作

git的tag

可以看做大量commit下的书签,需要在commit后再tag

创建

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 创建最后一个commit为tag
git tag v1.4-lw
# 创建某次commit为tag
git tag -a tagName commitId
# 带注释的tag
git tag -a v1.4 -m "my version 1.4"

查看tag

折叠代码块BASH 复制代码
1
2
3
4
5
6
# 查看本地某个 tag 的详细信息:
git show tagName
# 查看本地所有 tag
git tag
# 查看远程所有 tag:
git ls-remote --tags origin

删除tag

折叠代码块BASH 复制代码
1
2
3
4
# 本地 tag 的删除:
git tag -d tagName
# 远程 tag 的删除:
git push origin :refs/tags/tagName

推送

折叠代码块BASH 复制代码
1
2
3
4
5
# 分支推送后,tag不会推送
# 推送tag可以如下
git push origin :tagName
# 一次全部推送本地所有tag
git push origin --tags

检出标签到分支

折叠代码块BASH 复制代码
1
git checkout -b branchName tagName

git中tag的操作

git常识

版本控制的好处

  1. 代码备份
  2. 当前版本代码改的很多,已经不知道原来是什么样了,想回到原来的样子
  3. 协同开发,可用于多人改了同一个文件的情况
  4. 代码追溯,可以知道哪行代码出了问题

版本控制方式

  • SVN
    集中式版本控制,只用一台服务器存储代码,工作时下载下来代码,修改后提交到中央版本库。必须要联网
  • Git
    分布式版本控制,没有中央服务器,每个人的电脑都有完整版本,工作时联网不是必须的,修改后推给对方修改的数据即可,或推给共享版本库。

分支常用规范

  • master分支:生产分支,跑这个代码。代码会从develop分支合并过来
  • develop分支:开发分支。可以先进入develop分支,然后branch一个feature分支,修改好后merge到develop分支
  • feature分支:新特性的分支,用于开发新功能。合并到develop后可以删除该分支
  • hotfix分支:用于修复bug的分支。先进入master分支,然后branch一个hotfix分支,修复后merge到master和develop分支
  • test分支:用于测试
  • pre分支:预上线分支
 评论
来发评论吧~
Powered By Valine
v1.5.2