git

git 基本命令

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
git config --global user.name 'XXX'
git config --global user.email 'XXX'
git init // 初始化代码仓库
git add learngit.txt // 把所有要提交的文件修改放到暂存区
git commit -m 'add a file' // 把暂存区的所有内容提交到当前分支
git commit -s -m // 添加 signed-off-by 信息,在日志中增加提交者签名
git commit -a -m // 相当于git add . 与git commit –m “本次提交描述”两句操作合并为一句进行使用。
git status // 查看工作区状态
git status -s // 查看改变的文件列表简化版
git diff // 查看不在缓冲区的文件的修改内容
git diff --cached // 查看缓冲区的文件发生的改变
git diff --staged // 查看缓冲区的文件发生的改变
git diff HEAD // 是 git diff 和 git diff --cached 的合并
git log // 查看提交历史
git log --pretty=oneline // 单行显示
git reset --hard HEAD^ // 回退到上一个版本,其中(HEAD^^(上上版本),HEAD~100(往上100个版本))
git reset --hard <commit_id>//(版本号) 可回到指定版本
git reflog // 查看历史命令

git diff HEAD -- <file> // 查看工作区和版本库里最新版本的区别
git checkout -- <file> // 用版本库的版本替换工作区的版本,无论是工作区的修改还是删除,都可以'一键还原'
git reset HEAD <file> // 把暂存区的修改撤销掉,重新放回工作区。
git rm <file> // 删除文件,若文件已提交到版本库,不用担心误删,但是只能恢复文件到最新版本

git checkout -b dev // 创建并切换分支
#相当于git branch dev 和git checkout dev
git branch // 查看当前分支,当前分支前有个*号
git branch <name> // 创建分支
git checkout <name> // 切换分支
git merge <name> // 合并某个分支到当前分支
git branch -d <name> // 删除分支
git log --graph // 查看分支合并图
/* 禁用Fast forward合并dev分支*/
git merge --no-ff -m 'message' dev
git stash // 隐藏当前工作现场,等恢复后继续工作
git stash list // 查看stash记录
git stash apply // 仅恢复现场,不删除stash内容
git stash drop // 删除stash内容
git stash pop // 恢复现场的同时删除stash内容
git branch -D <name> // 强行删除某个未合并的分支
#开发新feature最好新建一个分支
git remote // 查看远程仓库
git remote -v // 查看远程库详细信息
git pull // 抓取远程提交
/* 在本地创建和远程分支对应的分支*/
git checkout -b branch-name origin/branch-name
/* 建立本地分支和远程分支的关联*/
git branch --set-upstream branch-name origin/branch-name

ssh

1
2
3
4
5
6
7
8
9
// 创建SSH Key
ssh-keygen -t rsa -C 'your_email'

// 关联本地仓库,远程库的名字为origin
git remote add origin git@github.com:username/repostery.git

// 第一次把当前分支master推送到远程时要加 -u
// -u 参数不但推送,而且将本地的分支和远程的分支关联起来
git push -u origin master

tag

1
2
3
4
5
6
7
8
9
git tag v1.0                    //给当前分支最新的commit打标签sh
/* -a指定标签名,-m指定说明文字*/
git tag -a v0.1 -m 'version 0.1 released' 3628164
git tag -s <tagname> -m 'blabla'//可以用PGP签名标签
git tag //查看所有标签
git show v1.0 //查看标签信息
git tag -d v0.1 //删除标签
git push origin <tagname> //推送某个标签到远程
git push origin --tags //推送所有尚未推送的本地标签

reset

git reset –option <commitid>是回滚命令,option 有三个参数可选:

  1. –mixed,这也是默认方式(即不带参数默认是这种),回退暂存区和版本库信息,工作区的源码不会变化,可以重新add,重新commit。
  2. -soft,回退版本库信息,暂存区和工作区都不会变化,如果还要提交,暂存区已经 add 完毕,直接 commit 即可。
  3. –hard,彻底回退,版本库信息、暂存区和工作区都回退到历史某个版本

git 复杂操作合集

回滚某个文件

  1. git log –pretty=oneline <file>可以查看某个文件的修改历史。
  2. git show commit_id <file>可以查看对应某个commit时期file的内容。
  3. git reset commit_id <file>可以将file回退到某个版本
  4. 执行完第3步后提示:
1
2
Unstaged changes after reset:
M README.md

执行git status,提示:

1
2
3
4
5
6
7
8
9
10
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: README.md

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: README.md

执行git checkout — <file>后,README.md成功回滚到指定版本。

聚合commit_msg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
git rebase -i <commit_ID>
git rebase -i master
git rebase -i HEAD~<num>

// squash:将这一行的 commit 与上一个 commit 进行合并
// fixup:与 squash 相同,只是不会保留这行 commit 的提交 message 信息

// 修改上一次 commit 提交的 message
git commit --amend
// 不过只能修正上一次的 commit。如果很多个 commit 之前就有 message 写错,就得用上我们之前说的 git rebase 了

// 自动标记这一次的 commit 为上一个 commit 的 fix
git commit --fixup <commit>
// 自动组织合并两个 commit
git rebase -i --autosquash

// 撤销过去的 commit 重建一个新的
git reset HEAD~2
git add .
git commit -am "This is the new feature"
git push --force

修改提交至其他分支

当前处于 A 分支,需要将此次的代码提交至 B 分支,则在没有进行 commit 之前可以进行以下操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1、通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改
git stash

// 2、然后切换至B分支
git checkout B

// 3、从git栈中获取到最近一次stash进去的内容,恢复工作区的内容,获取之后,会删除栈中对应的stash
git stash pop

// 4、然后进行正常的提交代码步骤即可
git add ...
git commit -m "功能开发"
git pull origin <分支名称>
git push origin <分支名称>

本地连接远端仓库

1
2
3
git remote add origin <url>
git pull --rebase origin master
git push -u origin master

强制拉取最新代码

1
2
3
git fetch --all
git reset --hard origin/<develop>
git pull

git stash 临时保存修改

stash命令可用于临时保存和回复修改,可跨分支。

注:在未add之前才能执行stash!!!

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
//把暂存区内的修改存储起来:
git stash
//切换到正确的分支:
git checkout 分支名
//将存储的修改取出来:
git stash pop
// 继续进行提交等正常的操作

git stash [save message]
# 保存,save 为可选项,message 为本次保存的注释

git stash list
# 所有保存的记录列表

git stash pop stash@{num}
# 恢复,num是可选项,通过git stash list可查看具体值。只能恢复一次

git stash apply stash@{num}
# 恢复,num是可选项,通过git stash list可查看具体值。可回复多次

git stash drop stash@{num}
# 删除某个保存,num是可选项,通过git stash list可查看具体值

git stash clear
# 删除所有保存

git submodule 管理

1
2
git submodule add xxx
git clone --recurse-submodules xxx

出错解决方案合集

  • ‘fatal:remote origin already exists’
1
2
3
git remote rm origin
git remote add origin XXX
git push -u origin master
  • 如何删除 git 远程仓库项目的所有内容,重新提交所有内容

忘记添加 gitignore 文件

1
2
3
git rm -r --cache .
git add .
git commit -m "gitignore working"
  • git 取消本地修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 未添加到暂存区
git checkout -- <filepathname>

// 放弃所有的文件修改
git checkout .

// add 到了缓存区的代码
git reset HEAD <filepathname>

// 放弃所有缓存区代码,回退到已修改但未存到缓存区的状态
git reset HEAD .

// 已经提交了代码
git reset --hard HEAD^

// 若想回退到任意版本
git reset --hard commit_id
  • 清理版本库信息
1
2
3
4
// 删除文件夹下的所有 .svn 文件
find . -name ".svn" | xargs rm -Rf
// 删除文件夹下的所有 .git 文件
find . -name ".git" | xargs rm -Rf
  • git clone 反复需要输入用户名密码
1
git config --global credential.helper store
  • 文件修改后git add了,也git commit了,发现哪里错了或者是漏add了一个文件。
1
2
3
4
// 添加新修改到暂存区
git add file
git commit –amend -m "xxx" // 这样只会记录一次`commit`
// 相当于将两次 commit 合并成了一次,保留最后一次 message 内容