代码改变世界

git 个人手册

2019-07-02 11:55  清晨、午后  阅读(239)  评论(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 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分支远程仓库

 

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

-------------------