git 个人手册
2019-07-02 11:55 清晨、午后 阅读(271) 评论(0) 编辑 收藏 举报1. 基本概念
工作区--看得见的文件夹,也就是实际编辑的文件
暂存区--执行 git add filename 命令后,执行命令时刻的 filename 将添加到暂存区
本地仓库--执行 git commit 后,执行命令时刻的暂存区的内容将提交到本地仓库
远端服务仓库--执行 git push 后,将内容提交到远端服务仓库
2. 分支操作
克隆master分支
git clone http://192.168.132.220/asm/ddm.git //http://192.168.132.220/asm/ddm.git 为URl
查看分支/tag
git branch -r //查看远程分支
git branch //查看本地分支
git tag // 查看tag
切换分支/tag
git checkout feature_ZZB //切换到feature_ZZB分支/tag
查看哪些文件修改:git status
对比文件:git diff VRVDZWDYWTX/src/main.cpp
新建本地及远程分支
git checkout -b new_branch_name // 新建本地分支,且切换到新建的分支,前提是当前工作区是干净的
git push origin new_branch_name
// 推送分支到远程服务器,远程分支与本地分支同名
修改本地及远程名称
git branch -m old_branch new_branch // 本地分支名称修改
git push origin new_branch // 将本地修改过的分支推送远端
git push origin --delete old_branch // 删除远端分支
git branch -d old_branch // 删除本地分支,可以用以下命令强制删除git branch -D <分支名>
3. 查看修改
git status
git status -uno
4. 提交修改
添加需要提交的文件
git add filename
提交到本地仓库
git commit -m "message"
git commit -am "message" // 无需 git add ,将所有的修改全部 commit
提交到服务仓库
git push
补充提交(追加修改)
git commit --amend // 对本地最近一次提交的补充,比如最后一次提交导致编译失败,修改后用该命令再次提交,提交记录只显示一条(本次的 commitId 因该是覆盖了上一次的 commitId)
5. 撤销修改
撤销工作区的修改,让这个文件回到最近一次git commit或git add时的状态,注意-- 后面有空格
git checkout -- file
撤销暂存区的修改,重新放回工作区,内容不修改(git add 后文件到暂存区,一般显示绿色)
git reset HEAD file
撤销本地仓库的提交
git reset --soft HEAD^ // ^ 是上一次提交,可以是~1 ~2 等
修改提交描述信息(commit 后无push,如果已经push, 使用 git push origin (分支名称,慎重!如 master) -f )
git commit --amend -m "新的提交信息"
6. 代码回退
a. 回退到指定版本,命令如下
git reset --hard HEAD^ 回退到上个版本
git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
git reset --hard commit_id 退到/进到 指定commit的sha码
b. 强制覆盖远程分支
注意回退后直接 push 是不会成功的,因为本地分支落后远程分支,必须强制 push,命令如下
git push --force // 强制推送 pull 也可以
7. 协作开发提交
git stash // 将当前工作区的修改暂存起来,同时会清空工作区的修改
推荐使用 git stash save “message” // 同事写一条stash 对应的信息
git pull // 拉取最新的远端仓库代码
git stash pop // 将暂存的代码弹出,如果没有冲突,则直接添加(绿色),如果有冲突(红色)则通过对比工具消除冲突,解决冲突后按正常提交修改即可
git stash list // 查看 stash 中的内容
git stash apply // 将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。
git stash drop + 名称 // 从堆栈中移除某个指定的stash
git stash clear // 清除堆栈中的所有 内容
git stash show // 查看堆栈中最新保存的stash和当前目录的差异。
8. 不同区域的代码对比
设置对比工具
$ git config --global diff.tool bc3
$ git config --global difftool.bc3.path
"c:/program files/beyond compare 3/bcomp.exe"
分支对比
1. 显示出branch1和branch2中差异的部分 git diff branch1 branch2 --stat 2. 显示指定文件的详细差异 git diff branch1 branch2 具体文件路径 3. 显示出所有有差异的文件的详细差异 git diff branch1 branch2 4. 查看branch1分支有,而branch2中没有的log git log branch1 ^branch2 5. 查看branch2中比branch1中多提交了哪些内容 git log branch1..branch2 注意,列出来的是两个点后边(此处即dev)多提交的内容。 6. 不知道谁提交的多谁提交的少,单纯想知道有是吗不一样 git log branch1...branch2 7. 在上述情况下,在显示出没个提交是在哪个分支上 git log --lefg-right branch1...branch2 注意 commit 后面的箭头,根据我们在 –left-right branch1…branch2 的顺序,左箭头 < 表示是 branch1 的,右箭头 > 表示是branch2的。
9.用户名管理
清除本地用户名密码
在操作系统中以管理员身份打开命令行工具
输入git config --system --unset credential.helper命令,作用就是清空本地保存的用户名和密码
解决每次拉取、提交代码时都需要输入用户名和密码
git config --global credential.helper store //在 ~/.gitconfig目录下多出一个文件,用来记录你的密码和帐号,然后在操作的时候输入一次即可记住
10.协作开发更新代码步骤
查看远程仓库地址
git remote -v
$ git remote -v
origin http://192.168.132.220/asm/ddm-gui.git (fetch)
origin http://192.168.132.220/asm/ddm-gui.git (push)
11. 分支代码合并
1. 在dev分支开发新功能
2. 从dev分支切换到master分支
git checkout master
将本地的dev合并到了master分支上
git merge dev
git merge --no-ff dev // 会生成 commit id
合并单个commit到指定的分支上
git log //查看提交的日志,复制要合并的那个分支的commit id(简略ID-前8位数) git checkout 要合并的分支 // 切换到要合并的分支上 git cherry-pick 上面复制的那个要合并的commit id // 提交该commit到当前分支 git push // 推送到B分支远程仓库
gerrit操作cherry-pick冲突解决和jinkens编译合入代码_gerrit cherry pick-CSDN博客
12 .仓库迁移
git push --mirror https://xxx/new_group_name/new_proj.git // 新仓库必须是一个空的
13. tag 操作
1. git tag <name>就可以打一个新标签
加上-a参数来强制创建一个带备注的tag,备注信息由-m指定。如果你未传入-m则创建过程系统会自动为你打开编辑器让你填写备注信息。
git tag -a tagName -m "v0.1.0"
git tag tagName -m "v0.1.0" // 与上一条命令一致
2. 列出已有的tag
git tag
3.给指定的某个commit号加tag
git tag -a v1.2 9fceb02 -m "v0.1.1"
4.将tag同步到远程服务器
git push origin v1.0
推送所有:
git push origin --tags
删除tag
删除本地tag:
git tag -d v20190514
删除远程tag:
git push origin :refs/tags/v20190514
批量删除 v0.94.1.[0-9] 的tag
git show-ref --tag | awk '/v0.94.1.[0-9]$/ {print":"$2}' | xargs git push origin
查看标签信息
git shou v0.1.2 // 查看 v0.1.2 的详细信息
14. .gitignore的配置语法
# 忽略 .a 文件 *.a # 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件 !lib.a # 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO /TODO # 忽略 build/ 文件夹下的所有文件 build/ # 忽略 doc/notes.txt, 不包括 doc/server/arch.txt doc/*.txt # 忽略所有的 .pdf 文件 在 doc/ directory 下的 doc/**/*.pdf
15. 子模块
git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块
git push origin master 在子模块目录中推送子模块的修改
16.设置对比工具
编辑配置(添加或者删除)
git config --global --edit
git查看有哪些对比工具可以设置命令:
git difftool --tool-help
git 设置比较工具(meld,win下注意git的版本,Git-2.7.1.2-32-bit.exe 可以配置,Git-2.35.1.2-64-bit.exe 无法配置)
git config --global diff.tool meld(如果是win,安装meld后要将 Meld.exe所在的目录加到环境变量中,或者使用 git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe" 指明路径)
设置好后,使用命令 git difftool 即可用设置的工具对比
文件夹对比
下载 git-diffall #https://github.com/thenigan/git-diffall
安装git-diffall
cp git-diffall $(git --exec-path) // 注意文件的权限
使用 git diffall
和历史提交记录对比
git diffall HEAD HEAD^1
17. 远程分支强覆盖本地分支
git fetch --all
git reset --hard origin/master (这里master要修改为对应的分支名)
git pull
18.统计代码行数--某个人某段时间内的提交
git log --author="liyubo" --since='2021-01-01' --until='2021-03-31' --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "增加的行数:%s 删除的行数:%s 总行数: %s\n",add,subs,loc }'
git log --all --author="liyubo" --since='2021-07-01' --until='2021-09-31' --pretty=tformat: --numstat >> ~/Desktop/Q3.txt // 某个时间段所有分支各个文件的增删情况
19.查看代码是哪位开发者提交的
git blame D:\code\test.py
20.修改 log 时间格式
git config --global log.date iso8601
-------------------