# gitTest **Repository Path**: huanzhidadi/git-test ## Basic Information - **Project Name**: gitTest - **Description**: 用来做一些git操作测试 - **Primary Language**: 其他 - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-02-26 - **Last Updated**: 2023-03-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # git操作 ## 1、初始化 Terminal中输入`git init` ## 2、在项目根目录下创建.gitignore文件,增加.gitignore内容 ``` *.bak *.[o] *~ *.swp *.swo *.bak out/ v8.log R.java *.img *.log default.properties bin/ gen/ *.tmp *.db *.classpath packages/apps/*/.classpath packages/apps/Settings/tests/.classpath packages/apps/Launcher2/lint.xml &1 .svn/ .goutputstream* project.properties .project .apt_generated/ .settings/ ``` ## 3、在gitee或其他代码托管平台新建仓库 ## 4、关联到git远程仓库 `git remote add origin https://gitee.com/huanzhidadi/git-test.git` ## 5、添加本地文件 单个文件 `git add AndroidManifest.xml` 单个文件夹 `git add src` 所有不在.gitignore 中的文件 `git add .` ## 6、提交到本地代码服务器 `git commit -m "First commit."` ## 7、commit后撤销 先使用git log 查看 commit日志找到需要回退的那次commit的哈希值 ``` git reset --hard commit_id git push origin HEAD --force ``` ## 8、推送至git远程仓库 `git push origin master` ## 9、git回退到指定版本 ### 9.1、已commit,未push到远程仓库 `git reset --soft (目标版本号)`撤销commit `git reset --mixed (目标版本号)`撤销commit和add ### 9.2、已commit,并且push到远程仓库,reset(会覆盖目标之后的提交记录) `git log`查看要回退的版本号 `git reflog`用于回退后反悔的情况,查找之后的新版本号 查看完毕后,按`q`键返回 `git reset --hard (目标版本号)`将版本回退 `git push -f origin master`强推到远程仓库 ``` 操作验证步骤: 先提交推送当前版本 然后添加内容`reset后续提交1` 提交推送到远程仓库 添加内容`reset后续提交2` 提交推送到远程仓库 回退后,reset后续提交1和2版本记录在远程仓库中被删除 ``` ### 9.3、已commit,并且push到远程仓库,revert(生成一条新的提交记录) `git log`查看要回退的版本号 查看完毕后,按`q`键返回 `git revert -n (目标版本号)`将版本回退 这里可能会出现冲突,需要手动修改冲突的文件 `git commit -m '版本描述'` `git push origin master`推到远程仓库 ``` 操作验证步骤: 先提交推送当前版本 然后添加内容`revert后续提交1` 提交推送到远程仓库 添加内容`revert后续提交2` 提交推送到远程仓库 回退后,revert后续提交1和2版本记录在远程仓库中仍然存在 ``` ## 10、分支切换和合并 ### 10.1、分支切换 `git checkout -b dev`新建分支并切换 `git checkout dev`分支切换 ### 10.2、merge合并 比如当前通过`git checkout dev`切换到dev分支,想要合并master分支的最新代码,可以使用如下命令`git merge master` 解决完冲突后,dev分支就包含了master和dev两个分支的最新代码了。 然后再执行`git checkout master`切换到master分支,接着执行`git merge dev`,就可以把最新的dev分支代码合并到master分支上了。 git merge的特点: 1、使用简单。 2、由于每次都会创建一个额外的合并提交,它会导致提交历史看起来混乱和肮脏。 3、保留完整的历史和时间顺序。 ### 10.3、rebase合并 先举个例子,假设我们在master分支的A版本拉取一个dev分支,然后在dev分支上迭代了B和C两个版本,同时master分支上也迭代了D和E两个版本。 A --- D --- E <-- master \ B --- C <-- dev 这时候想要把dev分支合并到master分支上的话,可以使用如下命令。 ``` git checkout master git pull git checkout dev git rebase master 修改冲突文件内容后,根据情况执行后续命令: git add filename git commit -m "rebase合并1" git rebase --continue rebase后需要加-f强行push,因为本地feature相当于重置到master分支后再处理冲突后合并的,版本比远程feature早 git push -f origin feature ``` 运行rebase后,我们可以得到下面的版本记录 A --- D --- E --- B --- C <-- master git rebase的特点: 1、简化复杂的历史。 2 、避免在具有繁忙分支的仓库中合并提交噪音。 3、如果使用不当,则有风险,因为它不会保存历史。 注意:对于本地的分支或者确定只有一个人使用的远端分支用rebase,其余情况用merge。 `git rebase -i master` interactive 模式,可以实现压缩几个 commit,修改 commit 信息,抛弃某个 commit 等功能。 将要压缩的commit前面的 pick 改成s,然后保存就可以了。 ``` 通过验证,操作还是和git rebase一样,把feature的每次commit分别往master的最新位置合并, 只是最后只生成一条commit记录。 ``` ### 10.4、cherry-pick合并 假设当前所在分支为B,可以在Version Control的Log中选择在A分支单个commit或者多个commit的内容,会将选中的内容拉到B分支重新进行commit `git cherry-pick ba51861` cherry-pick单个commit `git cherry-pick ba51861..023sb6f299849a1f` cherry-pick多个commit,中间的两个点,表示把两个commit区间的所有commit多复制过去