# git-readme **Repository Path**: wuxianghao/git-readme ## Basic Information - **Project Name**: git-readme - **Description**: git的一些常用操作 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2018-09-12 - **Last Updated**: 2021-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 下载安装Git ,注册码云账号,登录进入码云,在个人设置里面配置公用的ssh密钥 命令|描述|备注 ---|---|--- `ssh-keygen -t rsa -C "xxxxx@xxxxx.com"`|生成本机的密钥|三次回车即可生成 ssh key `cat ~/.ssh/id_rsa.pub`|查看自己的密钥| --------------------- ### 分支常用操作命令 命令|描述|备注 ---|---|--- 查看分支|`git branch`| 创建并切换到分支|`git checkout -b `| 切换分支|`git checkout `| 删除分支|`git branch -d `| 强行删除|`git branch -D `| 合并分支|`git merge `|基于当前分支合并另外一个分支 例如 当前为master 合并dev到master分支 下载远程分支|`git fetch origin master:`|新建一个分支,并将远程origin仓库的master分支代码下载到本地分支 比对区别|`git diff `|比对当前分支与另一分支区别 版本回退|`git reset --hard HEAD^`| ^有几个就回退几个版本 查看提交历史|`git log`| 以便确定要回退到哪个版本 查看命令历史|`git reflog`| 以便确定要回到未来的哪个版本 查看命令历史|`git reflog`| 以便确定要回到未来的哪个版本 查看分支合并图|`git log --graph`| 查看分支合并图 普通模式合并|`git merge --no-ff -m "merge with no-ff" dev`| 合并后的历史有分支,能看出来曾经做过合并 查看状态|`git status`| 查看工作/暂存区 保存工作区|`git stash`| 把当前工作现场“储藏”起来 查看已保存工作区|`git stash list`| 把当前工作现场“储藏”起来 恢复工作区|`git stash pop`| 回到工作现场 查看远程库信息|`git remote`| 或者,用git remote -v显示更详细的信息 恢复工作区|`git stash pop`| 回到工作现场 ### 普通常用操作命令 命令|描述|备注 ---|---|--- 提交到暂存区|`git add .`|修改的和新建的 提交到版本库|`git commit -m 'message'`|将暂存区中的感动提交到本地版本库,message为改动的简要说明 提交至远程分支|`git push origin `|name:本地分支名 git push origin 本地分支名:远程分支名 ### 分支策略 在实际开发中,我们应该按照几个基本原则进行分支管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活; 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本; 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。 所以,团队合作的分支看起来就像这样: ### 多人协作的工作模式通常如下: 1. 首先将远程仓库克隆为本地仓库 `git clone git@github.com:xxx/LearnGit.git` 2. 在本地创建和远程分支对应的分支 `git checkout -b <本地分支名> origin/<远程分支名>` 本地和远程分支的名称最好一致; 3. 在本地分支完成任务后,可以试图用 `git push <远程主机名> <本地分支名>` 推送自己的修改; 4. 如果推送失败,则表明远程分支比本地更新,需要先用`git pull`试图合并; 5. 如果pull失败并提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令`git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名>`创建链接; 6. 如果合并有冲突,则解决冲突,并在本地提交(add => commit); 7. 没有冲突或者解决掉冲突后,再用`git push <远程主机名> <本地分支名>`推送就能成功。 ### 一、git客户端(本地仓库)的一些操作 **1.设置账户(需要和github账户设置一致)** ``` git config --global user.name xxx git config --global user.email xxx@foxmail.com ``` **2.查看设置** ``` git config --list user.name=xxx user.email=xxx@foxmail.com ``` **3.创建git本地仓库** ``` git init ``` 此时会出现提示 : inialized empty Git repository in d://com/liu/.git **4.查看git状态** ``` git status ``` 一般来说会显示需要提交的文件(uncommited)和未追踪的文件(untracked) uncommited:已有的,刚被修改尚未提交的 untracked:原先没有的,新建的 **5.添加git文件到暂存区(需要和版本库区分)** ``` git add ``` **6.git提交文件** ``` git commit -m "add a function in test.java" ``` -m表示注释,为提交时的说明,必须要有! **7.git删除文件(夹)** ``` git rm test.txt //删除文件 git rm -r filebook //删除文件夹 ``` git rm和直接删除的区别在于git rm会将此文件的操作记录删除,而直接删除仅仅是删除了物理文件,没有删除和此文件相关的记录。git rm后会在版本库产生区别(有操作日志),而直接删除没有。 可以用下面两种操作在版本库中删除文件: ``` git rm test.txt => git commit -m 'delete a file' rm test.txt => git commit -a```m 'delete a file' ``` 注意:命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。 **8.git操作日志** ``` git log --decorate --graph --oneline --all #显示当前及之前的版本号 git log --pretty=oneline #将版本历史显示为一行,历史版本号全部显示 git log --pretty=oneline --abbrev-commit #将版本历史显示为一行,历史版本号部分显示 git log --graph #查看分支合并图 ``` **9.版本回退** 执行版本退回后,本地工作区的内容会自动和回退到的版本库版本的内容保持同步 ``` git reset --hard HEAD^ 回退到上一个版本 git reset --hard HEAD^^ 回退到上上个版本,以此类推,一次提交即为一个版本 git reset --hard e9efa77 回退到 e9efa77 版本 ``` **10.git还原操作** 丢弃工作区的操作,但不会丢失暂存区的操作(add操作能将更改添加到暂存区),实际上就是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原” ``` git checkout -- readme.txt ``` **11.git暂存区撤销操作** 工作区修改了文件,而且执行了add,但还没执行commit,暂存区还是可以撤销的 ``` git reset HEAD readme.txt ``` 备注:git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。 ### 二.与github/gitee协同使用(git代码托管服务器) > 和GitHub相比,码云(Gitee)也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。 **1.配置远程仓库免密登陆** (1)在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:ssh-keygen -t rsa -C "xxx@foxmail.com" 备注:一路回车,执行生成 id_rsa 私钥 和 id_rsa.pub 公钥,Windows用户在git bash中输入上述指令 (2)获得key的内容,复制下来,添加到gitHub的SSH key中 windows位置:‪C:\Users\用户名\.ssh\id_rsa.pub Linux位置:cat ~/.ssh/id_rsa.pub (3)ssh -T git@github.com #验证key,根据提示输入yes,添加为信任主机 或者ssh -T git@git.oschina.net **2.添加远程仓库** `git remote add origin https://github.com/xxx/LearnGit.git(https方式)` (ssh方式) 此处可以为https地址也可以是ssh地址,orign为设置的远程仓库的别名,强烈建议使用ssh方式,因为https方式每次都要输入用户名和密码 如果需要修改传输协议: (1) git remote rm <远程主机名>(删除远- (2)程仓库) (2) 设置传输方式- (3)和目标远程仓库 (3) git push -u <远程主机名> <本地分支名> 码云的添加远程仓库方法: ` git remote add origin git@gitee.com:xxx/LearnGit.git(ssh方式) ` 如果git remote add失败,并报错:fatal: remote origin already exists. 说明本地库已经关联了一个名叫origin的远程库,此时,可以先用git remote -v查看远程库信息: origin git@github.com:xxx/LearnGit.git (fetch) origin git@github.com:xxx/LearnGit.git (push) 表示本地库已经关联了Github上的origin远程库,需要先删除已有的Github库: ` git remote remove origin ` 再关联码云的远程库(注意路径中需要填写正确的用户名): ` git remote add gitee git@gitee.com:xxx/LearnGit.git ` 因为git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库,所以一个本地库可以既关联GitHub,又关联码云! 使用多个远程库时,要注意git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。仍然以learngit本地库为例,先删除已关联的名为origin的远程库: ` git remote rm origin ` 然后,先关联GitHub的远程库: ` git remote add github git@github.com:xxx/LearnGit.git ` 注意,远程库的名称叫github,不叫origin了。 接着,再关联码云的远程库: ` git remote add gitee git@gitee.com:xxx/LearnGit.git ` 同样注意,远程库的名称叫gitee,不叫origin。 ``` 现在,我们用git remote -v查看远程库信息,可以看到两个远程库: gitee git@gitee.com:xxx/LearnGit.git (fetch) gitee git@gitee.com:xxx/LearnGit.git (push) github git@github.com:xxx/LearnGit.git (fetch) github git@github.com:xxx/LearnGit.git (push) ``` 如果要推送到GitHub,使用命令: ` git push github master ` 如果要推送到码云,使用命令: ` git push gitee master ` 这样一来,本地库就可以同时与多个远程库互相同步: **3.查看远程仓库及传输协议** ` git remote git remote -v 查看名称和详细地址 ` **4.删除远程仓库** ` git remote remove <远程主机名> ` **5.推送本地分支到远程仓库** ` git push <远程主机名> <本地分支名>:<远程分支名> ` 如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。 ``` git push origin <本地分支名> git push origin master ``` 如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样以后就可以不加任何参数使用git push。 ``` git push -u <远程主机名> <本地分支名> 例如:git push -u origin master ``` **6.将远程仓库克隆为本地仓库** ` git clone git@github.com:xxx/LearnGit.git ` 注意: (1)不能使用别名 (2)默认情况下,从远程clone到本地的库只能看到master分支,如果要将远程的分支同步到本地: git checkout -b <本地分支名> <远程主机名>/<远程分支名> 前提是远程<远程主机名>必须存在名为<远程分支名>的分支,而且<本地分支名>和<远程分支名>最好一致。 **7.本地仓库更新** 将远程存储库中的更改合并到当前分支中。在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的缩写。更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge。 以下是一些示例: git pull <远程主机名> <远程分支名>:<本地分支名> 比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样 - git pull origin next:master 如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为: git pull origin next 上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge。 git fetch origin => git merge origin/next 在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动“追踪”origin/master分支。Git也允许手动建立追踪关系: git branch --set-upstream-to=远程主机名/<远程分支名> <本地分支名> 比如git branch --set-upstream-to=origin/next master,指定master分支追踪origin/next分支。 git pull origin 上面命令表示,本地当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。 如果当前分支只有一个追踪分支,连远程主机名都可以省略。 git pull 上面命令表示,当前分支自动与唯一一个追踪分支进行合并。 如果合并需要采用rebase模式,可以使用–rebase选项。 git pull --rebase <远程主机名> <远程分支名>:<本地分支名> **git fetch和git pull的区别** (1)git fetch:相当于是从远程获取最新版本到本地,不会自动合并。 git fetch origin mastergit log -p master..origin/mastergit merge origin/master 以上命令的含义: 首先从远程的origin的master主分支下载最新的版本到origin/master分支上 然后比较本地的master分支和origin/master分支的差别 最后进行合并 上述过程其实可以用以下更清晰的方式来进行: git fetch origin master:tmpgit diff tmp git merge tmp (2)git pull:相当于是从远程获取最新版本并merge到本地 git pull origin master 上述命令其实相当于git fetch 和 git merge 在实际使用中,git fetch更安全一些,因为在merge前,可以查看更新情况,然后再决定是否合并。 **8.查看分支** `git branch` **9.创建分支** `git branch ` **10.创建并切换到分支** `git checkout -b ` 备注:git checkout命令加上-b参数表示创建并切换,相当于以下两条命令 `git branch git checkout ` **11.切换分支** `git checkout ` 切换分支后,在git bash中显示为绿色 **12.删除分支** `git branch -d ` 如果分支没有合并,删除分支就表示会丢失修改,此时git无法使用-d删除,可使用-D强行删除 git branch -D **13.合并分支** git合并默认使用Fast forward模式,一旦删除分支,会丢掉分支信息,也就看不出来曾经做过合并 git merge #基于当前分支,合并另外一个分支,前提需要保证分支之间不冲突 如果强制禁用Fast forward模式,即普通模式,Git就会在merge时生成一个新的commit git merge --no-ff -m "there is a comment" 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 工作中,肯定需要不管有没有分支被删除,都要从分支历史上就查看所有的历史分支信息,所以要使用普通模式合并。