public:it:git

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
public:it:git [2019/10/24 12:05] – [Tips] oakfirepublic:it:git [2024/09/02 11:41] (当前版本) – [Usage] oakfire
行 6: 行 6:
  
 ===== 二、GIT 与 SVN 的区别 ===== ===== 二、GIT 与 SVN 的区别 =====
-  * GIT 为分布式的,GIT 工程每个副本都是一个备份;而 SVN 是非分布的,依赖一个中心服务器; +  * GIT 为分布式的,GIT 工程每个副本都是一个备份;而 SVN 是非分布的,依赖一个中心服务器; 
-    * SVN 只有一个中心服务器,GIT 可以0个或多个;svn是提交,git是同步;+    * SVN 只有一个中心服务器,GIT 可以0个或多个远端备份;svn是提交,git是同步;
     * SVN 得连接中心服务器才能查看历史log; 而git不用;     * SVN 得连接中心服务器才能查看历史log; 而git不用;
   * GIT 以元数据方式存储(于.git隐藏目录);SVN 以文件方式存储;   * GIT 以元数据方式存储(于.git隐藏目录);SVN 以文件方式存储;
-    * SVN 的分支是一个完整文件目录;而 git 只保持一本地文件目录,切换分支直接改变该目录文件; +    * SVN 的分支是一个完整文件目录;而 git 只保持一本地文件目录,切换分支直接改变该目录文件; 
   * GIT 没有全局唯一版本号;SVN 有;   * GIT 没有全局唯一版本号;SVN 有;
-    * git 可以打 tag 来弥补;+    * git 可以打 tag 来弥补;但是 tag 只与 commit id对应,而 commit id 不能保证代码的唯一性(因为不同分支的同一 commit id 之前的提交历史可能不一样),所以要保证 tag 唯一性,可额外人为规定只有主分支打的tag是有效的。
  
 ===== 三、GIT 资料 ===== ===== 三、GIT 资料 =====
行 20: 行 20:
   * CentOS yum 默认只有1.7.1 版本, 但像github.com等网站需要高于此版本. 此时需要源码安装升级.   * CentOS yum 默认只有1.7.1 版本, 但像github.com等网站需要高于此版本. 此时需要源码安装升级.
   * 如果源码安装,[[http://github.com/git/git|github repo]], ''make'', ''make install prefix=/usr'', 如果不添加''prefix=/usr'', 默认会安装在当前home目录.   * 如果源码安装,[[http://github.com/git/git|github repo]], ''make'', ''make install prefix=/usr'', 如果不添加''prefix=/usr'', 默认会安装在当前home目录.
 +
 +==== Tools ====
 +  * 显示仓库信息[[https://github.com/o2sh/onefetch|onefetch]], 这个不错
  
 ==== Usage==== ==== Usage====
行 30: 行 33:
   * [[https://github.com/commitizen/cz-cli | Commitizen:Git 提交信息优化]]   * [[https://github.com/commitizen/cz-cli | Commitizen:Git 提交信息优化]]
   * [[http://pcottle.github.io/learnGitBranching/|Learning git branching]]   * [[http://pcottle.github.io/learnGitBranching/|Learning git branching]]
 +  * [[https://nvie.com/posts/a-successful-git-branching-model/|git flow]],[[https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow|gitflow-workflow]]
 +  * [[https://jvns.ca/blog/2024/01/26/inside-git/|Inside .git]], 介绍 .git 文件夹内容
  
 ==== Ignore ==== ==== Ignore ====
行 37: 行 42:
   * 简单概括:**父项目只记录子模块的commit id**,任何和“子模块”常识违背的额外操作,想想这个就理解了<del>但不能接受</del>   * 简单概括:**父项目只记录子模块的commit id**,任何和“子模块”常识违背的额外操作,想想这个就理解了<del>但不能接受</del>
   * 新增Submodule:<code bash>   * 新增Submodule:<code bash>
-git submodule add [repository 位置] [欲放置的位置# 增加一個新的 submodule +git submodule add <repository 位置> <欲放置的位置# 增加一個新的 submodule 
-git add .gitmodules [放置的位置]+git add .gitmodules <放置的位置>
 git commit -m "Add submodule into version control" # 提交修改 git commit -m "Add submodule into version control" # 提交修改
 git submodule init # 初始化.git/config git submodule init # 初始化.git/config
行 53: 行 58:
 git submodule init git submodule init
 git submodule update git submodule update
 +# 或一条命令循环初始化及更新子模块
 +git submodule update --init --recursive  
 </code> </code>
   * 修改Submodule的内容: <code bash>   * 修改Submodule的内容: <code bash>
-//直接进入子模块文件夹,进行常规git操作+直接进入子模块文件夹,进行常规git操作
 cd your-submodule-folder cd your-submodule-folder
 git add something git add something
行 66: 行 73:
   * 移除Submodule:<code bash>   * 移除Submodule:<code bash>
 # 先砍掉目录 # 先砍掉目录
-git rm --cached [欲移除的目錄] +git rm --cached <欲移除的目录> 
-rm -rf [欲移除的目錄]+rm -rf <欲移除的目录>
 # 修改 .gitmodules,将相关内容移除 # 修改 .gitmodules,将相关内容移除
 vim .gitmodules vim .gitmodules
行 89: 行 96:
 </code> </code>
 ==== Tips ==== ==== Tips ====
 +  * 查看暂存区(git add 的内容)的修改:''git diff --staged'' 或 ''git diff --cached''
 +  * 查看每次修改的文件统计(不显示具体代码修改):<code bash>git whatchanged --stat  
 +# 或者
 +git log --name-status</code>
 +  * 设置git走本地代理<code bash>
 +#只对github.com
 +git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
 +
 +#取消代理
 +git config --global --unset http.https://github.com.proxy) </code>
   * 增加远程仓库<code bash>git remote add [repo_name] git@remote_repo</code>   * 增加远程仓库<code bash>git remote add [repo_name] git@remote_repo</code>
   * 选择远程仓库push <code bash> git push [repo_name] [branch]</code>   * 选择远程仓库push <code bash> git push [repo_name] [branch]</code>
 +  * 删除远程仓库分支:<code bash>git push origin --delete branchname</code>
 +  * 删除本地的远程分支追踪(比如在远程分支删除后本地''git branch -a''还有遗留remote分支)<code bash>git branch -r -d origin/your_branch_name</code>
 +  * 同步本地的远程分支追踪<code bash>git remote prune origin</code>
   * 打tag最好用-a -m ,多一个obj,方便管理 <code bash>git tag -a tagname -m "message" [commit]</code>   * 打tag最好用-a -m ,多一个obj,方便管理 <code bash>git tag -a tagname -m "message" [commit]</code>
   * 删除远程仓库tag<code bash>   * 删除远程仓库tag<code bash>
行 101: 行 121:
 # tag <<tag>> means the same as refs/tags/<tag>:refs/tags/<tag>. # tag <<tag>> means the same as refs/tags/<tag>:refs/tags/<tag>.
 # Pushing an empty <src> allows you to delete the <dst> ref from the remote repository.</code> # Pushing an empty <src> allows you to delete the <dst> ref from the remote repository.</code>
-  * 删除本地的远程分支追踪(比如在远程分支删除后本地''git branch -a''还有遗留remote分支)<code>git branch -r -d origin/your_branch_name</code> +  * merge 分支后, 如果隐藏了分支的 commit 信息, 具体查看可以使用<code bash>git log --graph</code> 来列出合并分支的 commit , 再一一查看.
-  * merge 分支后, 如果隐藏了分支的 commit 信息, 具体查看可以使用<code>git log --graph</code> 来列出合并分支的 commit , 再一一查看.+
   * 撤销 ''git add FILE'' : <code bash>git rm --cached FILE # 撤销文件FILE   * 撤销 ''git add FILE'' : <code bash>git rm --cached FILE # 撤销文件FILE
 git rm -r --cached FOLDER # 撤销文件夹FOLDER</code> git rm -r --cached FOLDER # 撤销文件夹FOLDER</code>
-  * 加个比较爽的输出<code>+  * 加个比较爽的输出<code bash>
 git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative" git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
 </code> </code>
   * 合并特定的单个commit,可使用指令 ''git cherry-pick''   * 合并特定的单个commit,可使用指令 ''git cherry-pick''
 +  * 凭证存储: [[https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%87%AD%E8%AF%81%E5%AD%98%E5%82%A8|credential.helper]], 
 +    * 如果设为store模式,将在本地明文存储用户密码,节省下次输入:<code bash>git config credential.helper store</code> :!:这样会<wrap hi>明文</wrap>保存密码到 '' ~/.git-credentials''
 +  * 打印更多日志:<code bash>GIT_TRACE=2 GIT_CURL_VERBOSE=1 git clone <repo></code> 详见[[https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables#Debugging|git 环境变量]]
 +  * 提交空commit: <code bash>git commit --allow-empty -m "Empty"</code>
 +  * 修改上一次commit的message: <code bash>git commit --amend -m "new msg" </code>
 +  * 设置 vim 为默认编辑器:<code bash>git config --global core.editor "vim"</code>
 +  * 删除某文件的所有历史记录,[[https://blog.csdn.net/yxpandjay/article/details/111275665|参考]]:
 +    * 查找大文件:'' git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" ''
 +    * 从历史记录删除:'' git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "your/big.file"' HEAD --all  ''
 +  * 显示差异时忽略行尾空格差异: <code bash>git diff --ignore-space-at-eol</code>
  
 ==== server: gitolite ==== ==== server: gitolite ====
-  * [[http://gitolite.com/gitolite/gitolite.html|gitolite docs]]+  * [[http://gitolite.com/gitolite/index.html|gitolite docs]]
   * :!: ''conf/gitolite.conf''里,权限项单独的 ''C ''才表示创建 repo 的权限, 而 ''RWC''的 ''C''是表示禁止创建ref. 具体看[[http://gitolite.com/gitolite/conf.html#write-types|文档]].   * :!: ''conf/gitolite.conf''里,权限项单独的 ''C ''才表示创建 repo 的权限, 而 ''RWC''的 ''C''是表示禁止创建ref. 具体看[[http://gitolite.com/gitolite/conf.html#write-types|文档]].
  
行 120: 行 149:
 但对使用者来说, 命令的正交性不强这一点, 就造成了使用者需要记住大量单独的命令. 但对使用者来说, 命令的正交性不强这一点, 就造成了使用者需要记住大量单独的命令.
 考虑找个或弄个简化版的本地版本控制系统, 或者做个git的命令包装. 考虑找个或弄个简化版的本地版本控制系统, 或者做个git的命令包装.
 +这篇文章不错:https://www.highflux.io/blog/what-makes-git-hard-to-use
 </WRAP> </WRAP>
  
  • public/it/git.1571889912.txt.gz
  • 最后更改: 2019/10/24 12:05
  • oakfire