ToB企服应用市场:ToB评测及商务社交产业平台

标题: git用法 [打印本页]

作者: 用户国营    时间: 昨天 17:59
标题: git用法
根本原理
Git的设计哲学
追求最强性能
分布式 - 不依赖中央服务器,险些所有操纵都是本地执行
四种对象
commit tree blob tag
blob – 文件
tree – 目次
commit – tree, meta, pointer
构成一个小的文件系统
临时无法在文档外展示此内容
cd .git/object/
git cat-file -t
git cat-file -p
为什么改一下commit msg, commit id就变了?
git commit --amend 修补, 修改对象指针
git reflog 找到刚才的commit
使用别名
git config --global alias.br branch
git config --global alias.ci commit
~/.gitconfig
[alias]
co = checkout
ci = commit
cia = commit --amend
br = branch
di = diff
lo = log --oneline
sb = submodule
git clone -depth=10
检察历史
辅助选项
git log --color --no-decorate --decorate 是否显示tag, branch
git log --stat
git log --graph 树状图
git log -p
git log -p --patience 生成更准确的diff
git log --merges --no-merges 只显示/不显示 归并节点
git log -g git reflog 检察历史丢失的节点, 包括commit --amend
author和committer 的区分
git log --pretty=full 同时显示author和committer
检察分支的差别
git log --oneline --cherry-pick A…B (注意3个点)
git log --oneline --left-right --cherry-mark A…B (注意3个点)
git log --first-parent 只看主线改动
git log --reverse 从旧到新
格式化
git log --pretty="%h %an %s" 输出想要的字段和次序
检察统计
git shortlog -n -s 按作者提交的committer数排序显示每个人的提交
代码提交
暂存

提交部分代码
git add
git add -p
git commit
变基到最新的节点
git checkout master
git checkout -b
…修改代码…
git fetch
git rebase master

git pull --rebase
设置默认pull rebase
~/.gitconfig
[pull]
rebase = true
撤回
git revert 去掉某个提交,实际上是生成一个新的反向的commit
整理历史提交
修改刚提交commit
把改动合入到刚提交的commit, 同时可修改commit message
git commit --amend
会生成新的节点,当前分支指向新的节点,原有节点丢失(可以git log -g 或git reflog中看到)
把刚提交的几个commit合成一个
git reset HEAD~4
git commit -a -m “xxxxx”
把当前工作分支回退到任何一个commit
git reset --hard 抛弃未提交的所有改动
git reset --hard HEAD^^ 退回到前两个节点
git reset --hard 同步到远程分支最新节点
拆分已提交commit
git reset -p HEAD^
git commit --amend
把选y的改动抽出, git commit --amend后,原有commit只留下部分,剩下改动可以提交新的commit或抛弃
本地分支重新整理
git rebase --whitespace=fix HEAD^
git rebase -i HEAD~5
git rebase --continue
定位问题

主动定位
执行以下下令
git bisect run myscript.sh 主动执行测试,根据返回值决定checkout下一个commit来测试。
myscript退出值 0表示测试没问题, 1-127表示失败. 返回125表示不可测试(比如编译不通过), 跳过这个commit.
找到引入代码的人
git blame 找到谁引入了问题,区分是author还是committer
git blame -M 追踪代码行的移动, 可以找到原始改动,而不是挪到那些行的commit。
git blame -C 追踪文件中的重复代码行拷贝
git blame -C -C 追踪同一个commit中从其它文件拷贝过来的行。
git blame -C -C -C 追踪所有commit中从其它文件拷贝过来的行。
除了找到最原始是谁引入的代码, 也可用来检测是否有不必要复制代码。
分支的使用和管理

发起创建了本地个人临时分支,每天推到服务,备份代码,可用不同的remote服务器来存放个人临时分支
多remote

git push auto mybrach:mybranch
注意对应关系
git config -l
分支归并
无法复制加载中的内容
主线历史产生分叉点,追溯比较麻烦,只能把merge节点当作一个commit.
冲突办理集中在一个merge节点中,merge节点中修改可能混合了多个模块的改动。
比较分支时,merge节点的改动不容易拆分
分叉时间较长含有很多commit的分支用merge会比较省力,因为中间可能有对某一个文件反复修改的多个commit, merge时只必要处置惩罚一次。
理解Fastforward 概念
git merge --ff (允许fastfoward归并,默认,主动) --no-ff(不允许)
不产生归并节点
无法复制加载中的内容
git merge --squash 把分支合成一个commit,再合过来(实际上就没有分支了)
merge的原理
两条修改历史的归并
git merge
3-way merge的工作方式
只比较分支头结点和共同的祖先节点
对比双方的修改,无冲突合入, 有冲突,显示双方各自的改动
冲突办理技巧
通过mergetool下令调用特定的编辑器
git mergetool --tool=<vimdiff/meld/diff3>
修改完会主动调用git add
git log --merge -p 显示有冲突的文件
使用diff3格式,更清晰的看到冲突的地方
git config --global merge.conflictStyle diff3
example:
ours
  1. @@ -505,8 +505,6 @@ pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
  2.         if (pid && ns->level <= pid->level) {
  3.                 upid = &pid->numbers[ns->level];
  4. -               if (upid->ns == ns)
  5. -                       nr = upid->nr;
  6.         }
  7.         return nr;
  8. }
复制代码
theirs
  1. @@ -505,8 +505,9 @@ pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
  2.         if (pid && ns->level <= pid->level) {
  3.                 upid = &pid->numbers[ns->level];
  4. -               if (upid->ns == ns)
  5. +               if (upid->ns == ns) {
  6.                         nr = upid->nr;
  7. +               }
  8.         }
  9.         return nr;
  10. }
复制代码
Merged
  1. @@ -505,6 +505,15 @@ pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns)
  2.         if (pid && ns->level <= pid->level) {
  3.                 upid = &pid->numbers[ns->level];
  4. +<<<<<<< HEAD
  5. +||||||| merged common ancestors
  6. +               if (upid->ns == ns)
  7. +                       nr = upid->nr;
  8. +=======
  9. +               if (upid->ns == ns) {
  10. +                       nr = upid->nr;
  11. +               }
  12. +>>>>>>> feat2
  13.         }
  14.         return nr;
  15. }
复制代码
Merge的策略
完全放弃分支改动
git merge -s ours topic_branch
完全同步上游
git checkout -b tmpbranch master
git merge -s ours mybranch
git checkout mybranch
git reset --hard tmpbranch
优先用哪个分支
git merge -Xours
git merge -Xtheirs
减少冲突
git merge -Xignore-space-change
Merge的风险

  1.         //FOCUS ON
  2. -       spin_lock_irqsave(&chan->vc.lock, flags);
  3. +       raw_spin_lock_irqsave(&chan->vc.lock, flags);
  4.         ret = dma_cookie_status(dchan, cookie, txstate);
  5.         vd = vchan_find_desc(&chan->vc, cookie);
  6.         if (vd) {
复制代码
  1.         //FOCUS ON
  2. -       raw_spin_lock_irqsave(&chan->vc.lock, flags);
  3. +       spin_lock_irqsave(&chan->vc.lock, flags);
  4.         ret = dma_cookie_status(dchan, cookie, txstate);
  5.         vd = vchan_find_desc(&chan->vc, cookie);
  6.         if (vd) {
复制代码
Cherry-pick
单独拿从别的分支拿1个或多个patch合到当前分支
git cherry-pick
git cherry-pick master~4 master~2 拿主线上的最新第5个到第2个commit过来
git cherry-pick --continue
-n 不提交,只改变当前working tree
有冲突可以用git mergetool 办理
git cherry-pick --continue
git cherry-pick feat-a~2 feat-a 拿feat-a的最新3个commit过来
无法复制加载中的内容
分支变基
类似于cherry-pick, 只是把当前分支移动。
无法复制加载中的内容
feat-a分支的历史都变了
每次push到服务器前,都做一次rebase.
假如没有创建个人分支,则push前, git pull --rebase
利益:
主线保持线性历史,没有分叉,每个commit的修改明确
分支上如有cherry-pick的commit, rebase时会消除
历史回溯比较清晰,必要取中间任何一个commit作cherry-pick比较清晰
冲突办理分散在每一个commit中,revert一个commit, 更不容易冲突
适合分叉时间不长的功能分支,bugfix分支,个人本地开发分支
git merge --no-ff
其它技巧
向上游贡献
git format-patch
git am
也可以用于无直接服务器连接的同步
子模块
可以用来管理依赖的项目,比如某个库项目
git submodule add 增加一个依赖的git
git clone --recursive clone时把依赖模块同时clone出来
git submodule init
git submodule update
重接历史
git replace
把一棵树分成两个git, 必要的时候,又能把历史接起来。
大部分人不必要clone一棵全历史树
git remote add
git replace
工作树
假如你想在一台机器上同时在某个git的两个分支上工作, 不必要重复clone一份,节省时间和空间
git worktree add …/mytask
git worktree list
stg 在git外维护一系列patch
stg init
stg uncommit
stg pop
stg series
stg uncommit
stg uncommit
stg pop -a
弹出两个commit
2个commit变成栈里的两个patch
stg push -a
全部又推上去了
用处


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4