常用命令
1、git 拉取&推送
git clone [仓库地址] # 克隆仓库,加上-b 可以拉指定分支
git pull # 拉取远程最新代码 + 合并
git fetch # 拉取远程最新数据
git push # 推送代码到远程
2、git 加入到暂存区、临时工作区
git add . # 将文件的【新增、修改】添加到暂存区
git add -u # 将文件的【修改、删除】添加到暂存区
git add -A # 将文件的【新增、修改、替换、删除】添加到暂存区
3、git 保存/弹出工作现场
适用于开发时忘记切换分支的场景,后面不加文件名就是针对所有文件。
git stash [文件名] # 保存⼯作现场到栈
git stash pop [文件名] # 从栈中弹出⼯作现场
4、git add 命令后,
- 如何撤销已经加入到暂存区的文件呢?
- 取消跟踪某文件?
- 放弃修改?
git reset HEAD -- . # 撤销所有
git reset HEAD -- [文件名] # 撤销特定目标
git checkout [文件名] # 从缓冲区检出文件
git rm --cached [文件名] # 取消跟踪某文件
git restore [文件名] # 放弃修改
5、git 查看/创建/修改/删除/拉取/提交本地或远程分支
git branch # 查看本地分支
git branch -r # 查看远程分支
git fetch origin new_branch # 拉取远程分支
git branch -f branch_name commitID # 将指定分支移到某个commit上
git branch -b new_branch # 创建并切换至本地分支
git branch -m old_branch new_branch # 重命名本地分支
git branch -d old_branch # 删除本地分支
git push origin :old_branch # 删除远程分支
或 git push origin --delete old_branch
git push --set-upstream origin new_branch # 推送本地分支到远程/更新远程分支
6、拉取远程分支并创建本地分支
方法一
git checkout -b [本地分支名x] [origin/远程分支名x]
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
方式二
git fetch origin [远程分支名x] :[本地分支名x]
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动 checkout
。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
7、链接本地仓库到远程仓库
git init # 如果当前项目没有git版本库,需要先通过这个命令初始化仓库
git remote -v # 通过这个命令查看当前仓库链接的远程仓库
git remote add origin [远程仓库地址] # 添加远程仓库链接,与远程代码仓库建立连接
8、fork别人仓库并与原仓库保持同步
1、fork 源仓库到自己的 github
2、git clone [fork的仓库地址]
3、git remote add upstream [原仓库地址] 与原仓库建立链接,可通过 git remote -v 查看当前的源,也可通过 git remote remove 分支名 移除对应远程分支
4、切换到原仓库,执行 git pull upstream master 拉取代码,执行 git merge upstream/分支名 进行合并
// 基本操作
git remote add upstream [远程仓库git地址] # 本地新加⼀个新的远程库
git fetch upstream # 从远程仓库拉去代码
git chekout master # 切换分⽀
git merge upstream/master # 合并远程分⽀
tips:当然也可以通过反向 pull request
同步代码,参考这里
8.1、将一个仓库的代码复制一份到另一个仓库
1、创建旧仓库的裸克隆
git clone --bare https://github.com/exampleuser/old-repository.git
2、迁移到新仓库
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
3、删除旧仓库的克隆版
rm -rf old-repository.git
9、git 删除误提交的文件
git rm -r --cached .idea # 删除.idea文件夹
git commit -m '删除.idea' # 提交,添加操作说明
git push -u origin master # 将本次更改更新到github项目上去
git checkout . # 本地所有修改的、没有提交的,都恢复到原来的状态,checkout【文件名】丢弃指定文件的修改
git clean -df # 清理untracked files,释放工作区空间
10、git 标签操作
git tag # 列出所有标签,加上-l命令可以使用通配符来过滤tag,如 git tag -l '2.0.'
git show [标签名] # 查看标签详情
git tag [标签名] # 添加标签,可加上-a参数创建一个带备注的tag,如git tag -a tagName -m "my tag"
git tag -d [标签名] # 删除标签
git push origin :refs/tags/[标签名] # 删除远程标签
git push origin [标签名] # 将标签推送到远程,git push tags 推送本地所有标签
git checkout [标签名] # 切换到指定tag
11、git主分支同步到其它分支
改代码的时候忘记切换到指定分支,直接在主分支上改了,已经提交到 git 上了。
这时需要先切换到分支上,然后执行 git merge master
,其它分支同理。
12、推送子分支代码到父分支
当我们从某个分支迁出一个分支并提交修改后,想直接把该分支代码合并到父分支,但又不想切到父分支再 merge
再 push
。此时可以直接在当前分支上执行 git push origin 当前分支名:父分支名
。
13、git 忽略指定文件(不从版本库删除)
项目中一些需要在本地修改,又不能写进.gitignore中,就需要通过命令了
git update-index --assume-unchanged /path/to/file # 忽略
git update-index --no-assume-unchanged /path/to/file # 取消忽略
14、git 回退版本(git reset 和 git revert)
// 使用git log查看日志和版本号
git reset --hard HEAD^ # 回退到上一个版本(不加--hard,只回退,不会更新工作区)
git reset --hard [目标版本号] + git push -f # 【撤销到某个版本】重置版本,会删除重置版本之后的所有版本
git revert -n [目标版本号] + git commit -m + git push # 【撤销到某个提交】反转版本,会保留之前的提交版本,创建一个新的版本
15、git 合并代码(git merge 和 git rebase)
git merge [分支名] # 【合并分支】会自动生成一个新的合并commit,--no-diff参数可保留之前的分支commit
git merge --squash [分支名] # 【清洗提交历史】只合并不commit
git rebase [分支名] # 【变基操作】拉直分支图(美观),不会像merge那样产生新的commit(尽可能少的commit),比较干净,适用于个人项目或者冲突少的情况
git rebase -i [分支名] # 交互式 rebase,可以选择哪些commit需要rebase
16、配置用户名密码
git config --global user.name "yourName" # 设置用户名
git config --global user.email "aa@qq.com" # 设置邮箱
git config list # 查看配置列表
也可以直接用 github 官方客户端配置。
17、提交多行 commit 信息
有两种方法实现多行信息提交:
- git commit -m “标题” -m “描述”
- git commit -m "
标题
描述
"
18、查看日志
git log # 详细日志
git log --oneline # 简短⽇志
git reflog # 操作记录,包括回退记录也会被显示
19、把指定 commit 移动到当前分支上
可以把多个 commit 移动到当前分支上。
git cherry-pick commitId1 commitId2
20、添加子模块
可以使用 git submodule 命令实现。
git clone https://git.oschina.net/gaofeifps/body.git
git submodule init && git submodule update
# 下面这一句的效果和上面三条命令的效果是一样的,多加了个参数 `--recursive`
git clone https://git.oschina.net/gaofeifps/body.git --recursive
21、查看指定时间段代码提交行数
示例为:统计 “M酷” 在 2021-09-01 至 2021-09-11 期间提交的代码行数。
git log --author="M酷" --since=2021-09-01 --until=2021-09-11 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -;
GIT常见错误
1、拉取代码时提示 fatal: refusing to merge unrelated histories
我们只要加上 --allow-unrelated-histories
再试即可。
git pull origin master --allow-unrelated-histories
2、error: You have not concluded your merge (MERGE_HEAD exists)
原因是之前 pull 下来的代码自动合并失败,合并流程没有完全结束导致的。
解决办法:切换到项目文件夹中,使用 git 命令(这里提供 2 种方法,如果 a 方法没有用,可以尝试 b 方法,但是要慎重,避免造成本地代码丢失。)
a、保留本地的更改,中止合并 -> 重新合并 -> 重新拉取
git merge --abort
git reset --merge
git pull
b、舍弃本地代码,远端版本覆盖本地版本(慎重)
git fetch --all
git reset --hard origin/master
git fetch
3、gpg failed to sign the data
其实就是签名失败了,我们可以直接关闭签名功能,就是commit没有了绿标
git config commit.gpgsign false;
4、Unable to create ‘XXX/.git/index.lock‘: File exists
Git 执行操作时会自动生成 index.lock 文件,操作结束后会自动删除。这样做的目的是避免同时操作同一个文件夹。
只需要打开项目根目录下的 .git 文件,找到其中的 index.lock 文件即可。
评论区