前言

转载自git 宝典并 md 重新编辑

Git命令

建立本地仓库

命令 说明
git init 创建本地仓库
git init [project-name] 创建指定名称的本地仓库
git remote add origin git@github.com:UserName/yourProjectName.git 将本地仓库和远程仓库关联起来,避免每次 push 时都需要指定远程地址
git clone https://github.com/zhoulujun/yourProjectName.git 克隆远程仓库到本地

提交修改

命令 说明
git add [file1] [file2] ... 将指定文件添加到暂存区
git add [dir] 将指定目录添加到暂存区
git add -A 添加当前目录的所有文件到暂存区
git add -p 逐个确认每个变化的提交,适用于同一个文件的多处变化
git rm xxx 从本地仓库中删除指定文件
git rm -r xxx 从本地仓库中删除指定文件夹
git rm --cached [file] 从暂存区中删除文件,但保留工作目录中的文件
git mv [file-original] [file-renamed] 改名文件并将其改名操作放入暂存区
git commit -m "注释" 提交本机缓存中的内容到本机的 HEAD 中
git commit -a 提交工作区自上次 commit 之后的变化,直接到仓库区
git commit -v 提交时显示所有 diff 信息
git commit --amend -m [message] 替代上一次提交,用新的 commit 来修正提交信息
git commit --amend [file1] [file2] ... 重做上一次 commit 并包括指定文件的新变化
git push origin master 将本地的 commit 推送到远程服务器上
git push remoteBranchName tagName 提交指定 tag
git push remoteBranchName --tags 提交所有 tag

查看状态

命令 说明
git status 查看当前状态
git branch 查看本地所有分支
git branch -r 查看远程所有分支
git branch -a 查看本地和远程所有分支
git tag 列出所有 tag
git show tagName 查看 tag 信息
git log --stat 显示 commit 历史,以及每次 commit 发生变更的文件

分支操作

命令 说明
git checkout branchName 切换到指定分支,并更新工作区
git merge branchName 合并指定分支到当前分支
git branch newBranchName 新建一个分支,但依然停留在当前分支
git branch --track branch remote-branch 新建一个分支,并与指定的远程分支建立追踪关系
git branch -D branchName 删除目标分支
git checkout -b branchName 新建并切换至新分支
git branch -d -r branchName 删除远程分支
git branch -m oldbranchname newbranchname 重命名分支,使用 -M 参数则表示强制重命名

重命名远程分支

命令 说明
git branch -m old_name new_name 重命名分支(本地)
git checkout -b new_branch_name from_branch_name 本地建立新分支并切换过去
git push origin --delete old_name 删除远程分支
git push origin :old_branch 删除旧分支
git push --set-upstream origin new_branch 推送新分支,并设置本地分支跟踪新的远程分支

分支与主干合并

命令 说明
git merge branch --squash 在主干上合并分支,并提交合并后的代码
git commit -m '合并备注' 提交合并后的代码
git push 将代码推送到远程仓库
git merge master --squash 在分支上合并主干代码,并提交合并后的代码
git commit -m '合并备注' 提交合并后的代码
git push 将代码推送到远程仓库

强制覆盖本地代码

命令 说明
git fetch --all 与远程仓库保持一致
git reset --hard origin/master 强制覆盖本地代码
git pull 更新本地仓库
git fetch --all && git reset --hard origin/master && git pull 单条执行的强制覆盖本地命令

修改远程仓库地址

命令 说明
git remote origin set-url [url] 修改远程仓库地址
git remote rm origin 删除现有的远程仓库地址
git remote add origin [url] 添加新的远程仓库地址
直接修改 .git/config 文件 编辑 .git/config 文件中的项目地址

Git 配置

命令 说明
git config --list 查看配置列表
git config --global user.name "xxx" 配置用户名
git config --global user.email "xxx" 配置邮箱
ssh-keygen -t rsa -C "Github 的注册邮箱" 创建本地 SSH 密钥
在 GitHub 中添加 SSH key 将生成的 SSH key 添加到 GitHub 帐号中
ssh -T git@github.com 验证 SSH 配置成功

.gitignore 配置

命令 说明
在本地仓库根目录创建 .gitignore 文件 用于忽略指定文件和文件夹
[Tt]emp/ 过滤 Temp\temp 文件夹
*.suo 过滤 .suo 文件
!*.c 不过滤 .c 文件

这些表格可以帮助你更清晰地了解和记忆 Git 操作命令。

引用于 git 宝典—应付日常工作使用足够的指北手册 - git 使用的的一些日常小结合集 - 周陆军的个人网站 (zhoulujun.cn)

Git 删除远程分支上的某次提交

git 删除远程分支上的某次提交 - 知乎

关于远程仓库回滚

首先,必须要明白的一件事,任何普通用户不能擅自做有关远程仓库回退的操作,如果你擅自回滚了远程仓库,会对项目团队其他人造成不可预知的影响。如果需要回退版本,先联系项目的仓库管理员,在团队其他人都对自己本地未提交的工作做好备份之后,再进行远程仓库回退操作,操作结束后,团队成员需要重新同步远程仓库后继续自己的工作。

通常回滚远程仓库会有以下三种情形:

1、删除最后一次提交

这种情况是最简单的了,只需要以下两步就可以了

1
2
git revert HEAD
git push origin master

注意,revert和reset的区别:

revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在,而reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。如果还没有理解的话,我们做如下测试:
假设我们有以下三次提交记录:

现在我们使用revert放弃最后一次提交,之后执行git log:

1
2
git revert HEAD
git log

历史记录中还有第三次提交的记录,并且多了一次的提交,但是仓库内容已经回到了第二次提交之后的状态。 现在我们使用reset回到第三次提交,之后执行git log:

1
2
git reset --hard HEAD^
git log

历史记录中已经没有之前revert生成的提交记录了,现在应该明白了吧。 如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下:

1
2
git reset --hard HEAD^
git push origin master -f

-f 参数是强制提交,因为reset之后本地库落后于远程库一个版本,因此需要强制提交。

2、删除历史某次提交

这种情况需要先用git log命令在历史记录中查找到想要删除的某次提交的commit id,比如下图中圈出来的就是注释为”2”的提交的commit id(由此可见提交的注释很重要,一定要认真写)

然后执行以下命令(”commit id”替换为想要删除的提交的”commit id”,需要注意最后的^号,意思是commit id的前一次提交):

1
git rebase -i "commit id"^

执行该条命令之后会打开一个编辑框,内容如下,列出了包含该次提交在内之后的所有提交。

然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了:

1
git push origin master -f

3、修改历史某次提交

这种情况的解决方法类似于第二种情况,只需要在第二条打开编辑框之后,将你想要修改的提交所在行的pick替换成edit然后保存退出,这个时候rebase会停在你要修改的提交,然后做你需要的修改,修改完毕之后,执行以下命令:

1
2
3
git add .
git commit --amend
git rebase --continue

如果你在之前的编辑框修改了n行,也就是说要对n次提交做修改,则需要重复执行以上步骤n次。

需要注意的是,在执行rebase命令对指定提交修改或删除之后,该次提交之后的所有提交的”commit id”都会改变。