# git **Repository Path**: zzk123456/git ## Basic Information - **Project Name**: git - **Description**: git的使用方法大全 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-21 - **Last Updated**: 2025-02-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Git必知必会 ## Git help ``` 如: git help pull git help clone #键入后看一看效果 git help everyday ``` ## 安装完Git、创建一个仓库要做的几件事 ### 配置Git * 配置文件如何生效 >Git的配置文件为.gitconfig。 >配置文件的权重是仓库>全局>系统。 >Git会使用这一系列的配置文件来存储你定义的偏好。 >它首先会查找/etc/gitconfig文件(系统级),该文件含有对系统上所有用户及他们所拥有的仓库都生效的配置值。 >接下来Git会查找每个用户的~/.gitconfig文件(全局级)。 >最后Git会查找由用户定义的各个库中Git目录下的配置文件.git/config(仓库级),该文件中的值只对当前所属仓库有效。 >以上阐述的三层配置从一般到特殊层层推进,如果定义的值有冲突,以后面层中定义的为准,例如:.git/config和/etc/gitconfig的较量中,.git/config取得了胜利。 * 显示当前的Git配置 > l为list简写 ``` 查看仓库级的config,命令:git config --local -l 查看全局级的config,命令:git config --global -l 查看系统级的config,命令:git config --system -l 查看当前生效的配置,命令:git config -l ``` * 使用git config命令编辑配置文件 > 场景:不同环境提交名不一样 ``` git config [–local|–global|–system] -e 查看仓库级的config,命令:git config –local -e 查看全局级的config,命令:git config –global -e 查看系统级的config,命令:git config –system -e ``` * 查看某个配置项的值 ``` git config [–local|–global|–system] --get section.key (默认是获取 local 配置中内容) ``` * 设置Git配置信息 ``` git config [–local|–global|–system] section.key value (默认是添加在 local 配置中) ``` * 设置姓名和Email ``` git config --global user.name "Your Name" git config --global user.email "your_email@whatever.com" ``` * 设置行尾首选项(异构系统结束符转换) ``` Unix/Mac 用户: git config --global core.autocrlf input git config --global core.safecrlf true Windows 用户: git config --global core.autocrlf true git config --global core.safecrlf true ``` ### 写README.md 一个仓库,写README.md是一个基本素养。不多解释。 ### 配置.gitignore > 做代码管理时,配置.gitignore是必不可少的流程。一些系统或者IDE会在目录下生成与项目不相关的文件,如如日志文件,或者编译过程中创建的临时文件。而这些文件我们不希望被提交到仓库中。 如下给出一个Java项目的.gitignore配置。覆盖Idea和Eclipse。 ``` # eclipse ignore .classpath .project .settings/ .springBeans .metadata/ # idea ignore *.iml .idea/ *.ipr *.iml *.iws # maven ignore target/ *.class *.war *.zip *.tar *.tar.gz # temp ignore *.log *.cache *.diff *.patch *.tmp logs/ build/ *.java~ *.properties~ *.xml~ # system ignore .DS_Store Thumbs.db #mgb generatorConfig.xml generatorConfig.properties mbg /META-INF META-INF/ .mymetadata ``` ## 初始化本地仓库 ``` #在当前目录新建一个版本仓库 git init #新建⼀个目录,将其初始化为Git仓库 git init [project-name] #克隆、下载一个仓库 git clone [url] 如:git clone https://github.com/jquery/jquery.git ``` ## 把文件添加到暂存区 > git add命令实际上就是把要提交的所有修改放到暂存区(Stage) ``` #添加指定⽂文件到暂存区,.或*代表当前⽬录的所有文件。 git add file1.txt git add file2.txt file3.txt git add *.txt git add . git add * git add src/ #目录 ``` ## 文件删除 ``` #删除工作区文件,并且将这次删除放入暂存区,git rm命令会同时删除工作区和暂存区中的文件(即会删除物理文件),要慎重处理 git rm [file1] 可以继续使用git reset HEAD file1将文件放到工作区 然后再可以使用git checkout -- file将文件变回来 #停⽌追踪指定文件,但该文件会保留在工作区 git rm --cached [file] ``` ## 提交至本地仓库 > git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。 ``` git commit -m 'add : 新增readme.txt' git commit [file1] [file2] ... -m [message] ``` ## 推送提交到远程仓库 ``` git push <远程主机名> <本地分支名>:<远程分支名> 省略远程分支则补推送到远程同名分支;无同名分支则重建; 省略本地分支则表示删除指定的远程分支(即推送一个空分支,等同于git push origin --delete master) git push origin master #-u,push的同时设置远程跟踪分支 git push -u origin master #可以简写为: git push #推送所有分支到远程仓库 git push [remoteName] --all #强行推送当前分支到远程仓库,即使有冲突 git push [remoteName] --force 或 git push [remoteName] -f #推送所有分支到远程仓库,一般在仓库迁移时用的多 git push [remote] --all ``` ## 拉取远程仓库的更新 ``` #下载远程仓库的所有变动,但不会自动merge git fetch [remoteName] 可简写为: git fetch #取回远程仓库的变化,并与本地分支合并。相当于git fetch和git merge。 git pull [remoteName] [branch] 可简写为: git pull #在实际使用中,git fetch更安全一些。因为在merge前, 我们可以查看更新情况,然后再决定是否合并。 git pull origin next 等效于: git fetch origin git merge origin/next ``` ## 查看信息 ### 查看工作区状态 ``` git status #紧凑式格式显示 git status --short 等价于git status -s ``` ### 查看提交历史 ``` git log #显示最近5次 git log -5 #查看文件的更改历史与明细 git log -p #只查看某个用户的提交 git log --committer=chenxushao 或 git log -p --author=chenxushao git log --since=2011-05-24 git log --until=2011-05-25 git log --name-only #单行显示 git log --pretty=oneline git log --pretty=online -5 git log --pretty=format:%h:%s git log --graph git log fileName #查看指定文件的修改记录 #grep git log --grep '测试' #显示的更加漂亮和简洁 git log --all --pretty=format:'%h %cd %s (%an)' --since='7 days ago' #更加漂亮的log git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit #显示commit历史,以及每次commit发⽣生变更更的⽂文件 git log --stat # 显示所有提交过的用户,按提交次数排序 git shortlog -sn #不包含merge commit git shortlog -sn --no-merges # 显示指定文件是什么人在什么时间修改过 git blame [file] #显示本地执行过git命令,就像shell的history一样 git reflog ``` ### git show ``` #显示某次提交的元数据和内容变化 git show [commit] eg: git show 1c002d git show HEAD git show HEAD^ git show HEAD^^ 显示某次提交发生变化的文件 git show --name-only [commit] ``` ### git grep ``` 从当前目录的所有文件中查找文本内容。如: git grep 'Git' ``` ### git diff ``` 1.git diff 查看工作区和暂存区之间差异。 2.git diff HEAD 查看工作区与当前仓库版本HEAD版本差异。 3.diff --cached / git diff --staged 查看暂存区与当前仓库版本差异 4.不查看具体改动,只查看改动了哪些类 git diff --stat 5.比较两个分支的差异。 git diff 分支a 分支b eg: git diff master develop ``` ## 后悔药、时光机 ### Git的版本 ``` HEAD表示当前版本,上一个版本就是HEAD^, 上上一个版本就是HEAD^^, 往上100个版本:HEAD~100。 ``` ### git reset (版本回退) #### git reset的三个参数 * --hard 将指定的提交全部抹掉,不在工作区,也不在暂存区,也不在仓库。 * --soft 将指定的提交放到暂存区。给你修改再commmit的机会。如果你需要修改,则需要先将暂存区中的放到工作区,然后再重新git add,git commit * --mixed(不加参数时,默认就是mixed) 将指定的提交放到放到工作区。给你重新git add,git commit的机会 #### 让HEAD覆盖暂存区 ``` git reset HEAD #还没有提交的内容重新回到工作区 ``` #### 回退到上一个版本 ``` git reset --hard HEAD^ ``` #### 回退到上上一个版本 ``` git reset --hard HEAD^^ ``` #### 回退到上5个版本 ``` git reset --hard HEAD~5 ``` #### 回到任意版本 ``` 1.先使用git reflog查看提交历史及commit id git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: append GPL ea34578 HEAD@{2}: commit: add distributed cb926e7 HEAD@{3}: commit (initial): wrote a readme file 2.再使用回退命令 [撤销已经commit的内容] git reset --hard 3628164 3.如果回滚要推到远程仓库 #-f强制覆盖 git push -f ``` ### git revert >git revert撤销某次提交,此次操作之前和之后的commit history都会保留。 >并且把这次撤销作为一次最新的提交进行保存。 >而reset是指将当前head的内容重置,不会留任何痕迹。 ``` # 新建一个commit,用来撤销指定commit git revert [commit] 如: git revert HEAD #撤销倒数第一次提交 **需要注意,和reset不太一样** git revert HEAD^ #撤销倒数第二次提交 git-revert HEAD~2 #撤销倒数第三次提交 git revert commit #(比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。 ``` ### git checkout (撤销修改) #### 丢弃工作区的修改 ``` #将文件在工作区的修改全部撤销 git checkout -- file #如果是多个文件 git chenkout . 或 git checkout -- . #如果还没有git add至暂存区,则撤销修改就回到和版本库一模一样的状态。 #如果git add至暂存区后又做了修改,撤销修改就回到添加到暂存区后的状态。 ``` > 命令git checkout -- readme.txt就是让这个文件回到最近一次git commit或git add时的状态。 #### 将文件在暂时存区的修改撤销掉(unstage),重新放回工作区 > 文件已经执行git add ``` #从暂时区又回到了工作区 git reset HEAD file #如果你还想丢弃工作区的内容,继续执行: git checkout -- file ``` > git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。 ### 什么时候用git checkout,什么时候用git reset,什么时候用git revert? #### git checkout * 撤销工作区的修改 ``` git checkout -- file1 git checkout . ``` * 切换分支 ``` git checkout develop ``` * 查看旧版本,比如切换到某个提交,切换到某个tag ``` git checkout dac2e16 git checkout tag2 ``` #### git reset > git reset一般用在私有分支上。如果在确认没有风险的情况下,用在公共分支问题也不大。 * 让文件从暂时区回到工作区 ``` git reset HEAD file1 ``` * 在私有分支上舍弃一些没有push的更改 * ``` git reset --hard HEAD^ ``` ### git revert > git revert没有文件层面的操纵功能。因为git revert会新生成一个提交。所以一般用在公共分支上。 ``` git revert HEAD #撤销倒数第一次提交 ``` ## Git核心概念 ### 工作区(Working Directory或Workspace) ### 版本库(Repository) 工作目录中的.git隐藏目录就是Git版本库。 ### 暂存区(Index或Stage) Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区。 ### HEAD "HEAD"实际是指向master分支的一个“游标”。 ### 分支(Branch) git分支是为了隔离开发干扰而设计的,相互绝缘,互不干扰。常使用的场景是,多个开发者各自开发,以及多个功能并行开发。创建仓库的时候,master是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。 ### 远程仓库(Remote) ### 标签(Tag) 发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时 候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。 ### HEAD HEAD的本质是一个指针,指向当前工作目录所处的commit。 ### Git中的四种对象 #### blob对象 #### tree对象 #### commit对象 #### tag对象 > 一种特殊的commit对象 ## 远程仓库 ### 查看远程仓库的信息 ``` #显示所有远程仓库 git remote -v git remote #显示某个远程仓库的信息 git remote show [remoteName] 如:git remote show origin ``` ### 增加远程仓库 ``` git remote add [remoteName] [url] 如: git remote add osc https://gitee.com/cuser/learngit.git ``` ### 推送至远程仓库 ```shell #1.关联远程仓库 git branch --set-upstream-to=origin/remote_branch your_branch #2.设置推送模式为简单模式(simple模式即仅推送当前分支,matching模式将会推送所有本地已存在的同名分支到远程仓库) git config --global push.default simple #3.免密模式 git config --global credential.helper store 或调整~/.gitconfig文件 [credential] helper = store ``` ### 删除远程仓库 ``` git remote rm paul ``` ### 重命名远程仓库 ``` git remote rename pb paul ``` ### 修改远程仓库url ``` git remote set-url origin ``` ## 储藏 ### 保护现场 ``` git stash ``` ### 恢复现场 ``` git stash pop ``` ## 分支 ### 查看分支 ``` #查看本地分支关联的远程分支关系 git branch -vv #查看本地分支 git branch #查看远程分支 git branch -r #查看所有分支,包括本地和远程;可能需要先git fetch一下。 git branch -a #获取远程分支信息到本地,比如远程仓库增加了一些分支 git fetch #如果远程分支删除了 git fetch -p ``` ### 创建、切换分支 ``` #创建⼀个分⽀,但依然停留在当前分支 git branch #切换到指定分⽀,并更新工作区 git checkout #创建一个分支,并切换到该分支 git checkout -b #切换到上一个分支 git checkout - #新建一个分支,指向指定commit git branch ``` ### 关联远程分支 ``` #在现有分支与指定的远程分支之间建立关联关系 git branch --set-upstream-to=[remote-branch] [localbranch] 如:git branch --set-upstream-to=origin/develop develop 或 #当前分支与指定远程分支建立关联生态系统 git branch --set-upstream-to=[remote-branch] 如:git branch --set-upstream-to=origin/develop 或 #当前分支与指定远程分支建立关联生态系统 git branch -u [remote-branch] 如:git branch -u origin/develop 或 #推送新分支到远程仓库时加-u参数 git push -u origin develop ``` ### 合并分支 ``` #合并指定分支到当前分支 git merge <分支名> #合并分支到当前分支,不使用快速模式,推荐使用这种合并方式 git merge --no-ff feature-x ``` ### 删除分支 ```shell #删除本地分支 git branch -d #强制删除本地分支 git branch -D #删除远程分支 git push --delete origin [branch-name] 或 git branch -dr origin/branch 如:git push origin :feature-20170801-refactor ``` ### 重命名本地分支 ``` #重命名本地分支 git branch (-m|-M) #将devel重命名为develop git branch -m devel develop ``` ### 重命名远程分支 ```` 重命名本地分支。 git branch -m f3 f3-new 删除远程分支 git push --delete origin f3 推送新分支到远程仓库并做本地和远程仓库关联关系 git push -u origin f3-new ```` ### 实际开发中,版本库中有哪些分支 #### 常驻分支 * master(主分支) * develop(开发分支) #### 临时性分支 * 功能(feature)分支 * 预发布(release)分支 * 修补bug(fixbug) ## 标签(Tag) > tag是一个方便人识别某次提交的一个标记 ### 查看所有tag ``` git tag 可能输出如下: tag-20170630-v2.3.0 tag-20170801-v2.4.0 tag-20170801-v2.4.1 #当前分支的最近的tag git describe --tags --abbrev=0 ``` ### 创建tag ``` #创建一个tag在当前commit git tag [tag] #创建一个tag在指定commit git tag [tag] [commit] ##打一个带注释的tag git tag -a [tagName] -m [comment] 如: git tag -a tag-20170801-v2.1.0 -m "20170801[201708账单计算封版]" ``` ### 查看tag信息 ``` git show [tag] ``` ### 推送tag ``` #推送指定tag git push [remote] [tag] eg : git push origin tag1 #新建一个分支,指向某个tag git checkout -b [branchName] [tagName] #推送所有tag git push origin --tags 或 git push --tags ``` ### 删除tag ``` # 删除本地tag git tag -d [tag] #删除远程tag git push origin :refs/tags/[tagName] ``` ### 打tag的原则 ``` 重大变更release分支版本升级 (在master分支),稳定时间节点打tag,hotfix时。 正常情况下,只要master分支有合并操作,就要打tag。 ``` ## Pull Request 提交到远程仓库以后,就可以发出 Pull Request 到master分⽀,然后请求别⼈进⾏代码review,确认可以合并到master。 ## 命令别名 ``` 示例如下: git config --global alias.co checkout //checkout缩写成co git config --global alias.br branch //branch缩写成br ``` ## 一些工作场景 ### 查看仓库的总commit数量 ``` git log --oneline | wc -l ``` ### 看看谁的提交最多,按提交次数排序 > 很明显,chenxushao好几个分身,提交最多。 ``` git shortlog -sn 或 #仓库提交者排名前5 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 输出如下: 547 CHENXUSHAO 362 chenxushao 128 ZHANGYI12 77 杨鹏飞.数据中心.运营产品中心 71 chenxuhsao 65 xianliangzhang 3 ZHANGYI12 [张一] 1 root 1 zhaorenbing ``` ### 远程主机删除了某个分支,但是在本地还有 ``` 远程主机删除了某个分支,默认情况下,git pull不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。 要想本地也删除掉远程删除的分支。这样就可以: git fetch -p 或 git pull -p ``` ### 在github写了一个项目,为扩大影响力,想在oschina上也放一个 ``` 比如,你写在github上写了一个项目「My-Technical-stack-Summary」。 1.先看一眼 git remote -v origin https://github.com/chenxushao/My-Technical-stack-Summary.git (fetch) origin https://github.com/chenxushao/My-Technical-stack-Summary.git (push) 2.先在oschina上创建一个仓库「My-Technical-stack-Summary」。 https://git.oschina.net/cuser/My-Technical-stack-Summary.git 3.添加oschina的远程主机,并命名为osc git remote add osc https://git.oschina.net/cuser/My-Technical-stack-Summary.git 4.再看一眼 git remote -v origin https://github.com/chenxushao/My-Technical-stack-Summary.git (fetch) origin https://github.com/chenxushao/My-Technical-stack-Summary.git (push) osc https://git.oschina.net/cuser/My-Technical-stack-Summary (fetch) osc https://git.oschina.net/cuser/My-Technical-stack-Summary (push) 5.推送所有分支到osc远程仓库 git push osc --all 6.推送所有tag到osc远程仓库 git push osc --tags 7.后续可以愉快的分别将本地修改推送到github和oschina。 git push origin git push osc ``` ### 要上线了,需要将develop分支合并到master分支 > 其它分支合并,同理。 ``` 1.确保develop分支已经是和远程develop分支是一样的 git checkout develop git pull git checkout . 2.切换到master分支 git checkout master git pull git checkout . 3.将develop分支合并到master分支 #合并分支时必须使用--no-ff参数,以保留合并历史轨迹 git merge --no-ff develop 4.提交本地master分支到远程master分支 git push ``` ### 上线打tag > master是最干净的,tag要在master上打。 ``` 1.git tag -a tag-20170801-v2.1.0 -m "20170801[201708账单计算封版]" 2.git push --tags ``` ### 手贱写错了tag名称 > 比如将tag名称「tag-20170801-v2.1.0」写成了「tag-2017001-v2.1.0」 ``` 1.删除本地tag git tag -d tag-2017001-v2.1.0 2.删除远程tag git push origin :refs/tags/tag-2017001-v2.1.0 3.重打tag git tag -a tag-20170801-v2.1.0 -m "20170801[201708账单计算封版]" 4.重新推送tag git push --tags ``` ### 手贱写错了分支名 > 比如将开发分支(develop)写成了devlop(这个太low b了) ``` 1.如果分支还没有提交到远程仓库,直接重命名好了。 #将devlop重命名为develop git branch -m devlop develop 2.如果分支已经提交到了远程仓库, #重命名本地分支。 git branch -m devlop develop #删除远程分支 git push --delete origin devlop #推送新分支到远程仓库并做本地和远程仓库关联关系 git push -u origin develop ``` ### 删除临时分支 > 比如feature和hotfix分支 ``` 1.本地删除 git branch -d hotfix-20170605-v1.0.1 2.远程删除 git push --delete origin hotfix-20170605-v1.0.1 ``` ### 仓库迁移 > 比如公司老的gitlab(oldgit)做了迁移(newgit)。 > 两种方式。第一种参考「在github写了一个项目,为扩大影响力,想在oschina上也放一个」。 > 这里写第二种。 ``` 1.在newgit上创建一个新项目。如:learngit 2.进入到你要迁移的本地代码路径,并设置remote origin url。如:learngit cd learngit git remote set-url origin git@newgit.xxxx/learngit.git 3.推送所有分支到新的远程仓库 git push --all 4.推送所有tag到新的远程仓库 git push --tags 5.后续可以愉快的将本地修改推送到新仓库了 git push ``` ### 本地已有仓库,如何推送至远程仓库 > 比如,你在本地维护了一个仓库「learngit」,想放到oschia的仓库上去(放github上也类似)。 ``` 1.在github上创建一个仓库「learngit」 2.添加一个远程仓库。 cd existing_git_repo git remote add origin https://git.oschina.net/cuser/learngit.git #master第一次推送master分支的所有内容并做远程仓库和本地仓库关联 git push -u origin master 3.如下你还有不止master一个分支,而且还有tag,则继续往下执行。 git push --all git push --tags 4.后续可以愉快的将本地修改推送到新仓库了 git push ``` ### 修改了,还没有git add,想撤销 ``` git checkout -- a.txt ``` ### 文件修改后,已经git add了,还没有commmit,想撤销 ``` git reset HEAD file git checkout -- a.txt ``` ### 已经commit了,想撤销 ``` 1.先使用git reflog查看提交历史及commit id git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: append GPL ea34578 HEAD@{2}: commit: add distributed cb926e7 HEAD@{3}: commit (initial): wrote a readme file 2.再使用回退命令 [撤销已经commit的内容] git reset --hard 3628164 ``` ### 已经push了,想撤销 > 公共分支建立用git revert,私有分支建议用git reset。 ``` 56bd4e59cb HEAD^ #确保在没有风险的情况下这么做,否则先解决冲突。强制推送是危险的,只有在绝对必要的时候才能执行它。它将覆盖你的应用程序的历史记录,你将失去之后版本的任何信息。 git push -f ``` ### commit之后发现注释写错了 ``` #不会产生新的commit,只是修正上次commit。 git commit --amend -m "update comments here" ``` ### 不想切换分支,但是想看看对应分支中某文件的内容 ``` 如: git show master:Git必知必会/Git必知必会.md ``` ### 代码要基于tag回滚 > 一般上线之前都会打tag,就是为了防止上线后出现问题,方便快速回退到上一版本。 ``` #获取指定tag代码 git checkout -b branch_name tag_name 如: git checkout -b rollback_master_20170801 tag-20170801-v2.4.0 ``` ### 修改了一些内容,但还不能commmit,但是此时想切换一下分支,怎么办? ``` 正常情况会报如下提示: error: Your local changes to the following files would be overwritten by checkout: readme.txt Please commit your changes or stash them before you switch branches. Aborting 怎么解决? 可以先使用git stash暂存一下。分支切换回来后,通过git stash pop撤出来。 ``` ### 想提交一个空目录 ``` 比如,要想commit一个空的output目录,可以: mkdir output touch output/.keep git add output/.keep ``` ### 把当前分支中未提交的修改移动到其他分支 ``` git stash git checkout new-branch git stash pop ``` ## 其它 * git gc > 垃圾回收,每隔一段时间例如一个月运行一次可以减少磁盘占用空间 ## 一些概念 ``` master : default development branch origin : default upstream repository,远程仓库的默认名称为origin HEAD : current branch and commit HEAD^ : parent of HEAD HEAD~4 : the great-great grandparent of HEAD branch : conflict : commit : pull : push : revert : ``` ## 参考 ### git guide ``` https://github.com/xirong/my-git http://jlord.us/git-it/index.html http://www.bootcss.com/p/git-guide/ http://backlogtool.com/git-guide/cn/ http://rogerdudler.github.io/git-guide/index.zh.html https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 https://www.atlassian.com/git/tutorials https://www.git-tower.com/learn/git/ebook/cn/command-line/introduction#start https://github.com/flyhigher139/Git-Cheat-Sheet https://git-scm.com/book/zh/v2 https://www.atlassian.com/git/tutorials http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn/ http://igit.linuxtoy.org/ ``` ### github参考 ``` https://github.com/tiimgreen/github-cheat-sheet/blob/master/README.zh-cn.md https://github.com/tiimgreen/github-cheat-sheet http://www.worldhello.net/gotgithub/ ``` ### Git Style Guide ``` https://github.com/agis/git-style-guide ``` ### .gitignore模板参考 ``` https://github.com/github/gitignore ``` # git实践 ## 一、标准语法 > git push <远程主机名> <本地分支名>:<远程分支名> > > 省略远程分支则补推送到远程同名分支;无同名分支则重建; > > 省略本地分支则表示删除指定的远程分支(即推送一个空分支,等同于git push origin --delete master)git push origin master ## 二、标签操作--tag > 1. git tag > 2. git tag -a -m "" 创建带注释标签(a=annotation) > 3. git push origin 标签发布 > 4. git push origin --tags 发布本地的所有标签(不会删除) > 5. git tag -d 删除本地标签 (d=delete) > 6. git push origin :refs/tags/ 推送空的分支到远程tag,即删除远程tag(同分支删除) > 7. git checkout 切换到标签,同分支切换 > 8. git tag -l -n 查看tag及tag相关的信息 ## 三、命名规则 > 1. master、develop/hotfix、feature 四分支管理 > 2. branch-date-desc 分支命名:分支类型-日期--描述 > 3. tag-date-version tag命名:tag-日期-描述 ## 四、提交规范 > 1. feature或feat:新功能 > 2. fix:修复bug > 3. docs:文档添加、修改,如README, CHANGELOG。 > 4. style:格式(不影响代码运行的变动,如格式化,缩进等) > 5. refactor:重构(即不是新增功能,也不是修改bug的代码变动) > 6. test:增加测试 > 7. chore:构建过程或辅助工具的变动(如package.sh) > 8. deps:依赖变更(比如guava版本变更) > 9. revert:撤销以前的commit(必须写清楚) > 10. log:增加、调整log输出等 > 11. perf:性能优化 > 12. config:配置文件修改(如第三方接口url调整) > 13. remove:移除 > 14. experience:体验优化 > 15. ui:纯粹CSS样式变动,不影响功能代码 > 16. other:其他原因,如上述不能覆盖,才用。如:合并代码,解决代码冲突等 ## 五、常见问题 "fatal: refusing to merge unrelated histories" 错误通常出现在两个不相关的 Git 仓库合并时,意味着 Git 拒绝自动合并这些仓库的历史记录。这通常发生在以下情况下: 1. 两个仓库的提交历史没有共同的祖先,它们在某个时间点独立创建并没有共同的提交记录。 2. 你在一个空的仓库中初始化了一个新的 Git 仓库,并尝试将其与另一个非空的仓库合并。 解决这个问题的方法有两种: 1. 使用 `--allow-unrelated-histories` 参数进行合并: ``` sqlCopy code git merge --allow-unrelated-histories ``` 使用这个参数可以强制合并两个不相关的仓库历史,将它们合并为一个新的历史。这将创建一个新的合并提交,将两个仓库的历史记录合并在一起。 请注意,这种方法可能会导致一些冲突,需要手动解决这些冲突。确保在合并之前备份重要的代码,以防万一。 2. 创建一个新的分支,将另一个仓库的内容拉取到新分支上: ``` sqlCopy code git checkout -b new_branch git remote add other_repo git fetch other_repo git merge other_repo/branchname ``` 这种方法会创建一个新的分支,并将另一个仓库的内容拉取到该分支上。这样可以避免合并历史记录时可能出现的冲突问题。 请注意,在使用这种方法之前,你可能需要将当前仓库的更改进行提交或备份,以确保不会丢失任何重要的更改。