# git_practice **Repository Path**: noyyh/git_practice ## Basic Information - **Project Name**: git_practice - **Description**: 学习使用git - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-02 - **Last Updated**: 2023-07-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基本命令 ### git diff 文件名 ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302191304.png) git diff 必须在git add 之后使用。 ### git log 作用是查看commit记录 ### git add add to stage ### git commit -m "自定义内容" 提交到版本库Repository ### git status ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302193325.png) 当没有提交到暂存区时,git status显示```untracked files``` 提交到暂存区后,git status显示```changes to be committed``` commit后,显示```no changes added to commit``` ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302194618.png) 但是由于README.md文件被修改了而没有staged,显示```modefied: README.md``` ### 提交到远程仓库 git push origin master # 版本回退 ### 回退一个版本 git reset --hard HEAD^ ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302200935.png) ### 回退到指定版本 首先查看提交版本 git reflog 然后回退到指定版本 git reset --hard 版本号 ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302201725.png) > 注意:虽然实现了指定版本回退(又回到了stupid版本),但是由于我们只是将"领导是个笨蛋!" add to stage > > 而没有将 “是的!蠢驴” add to stage ,导致“是的!蠢驴“丢失。以下一幅图是操作细节! ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302201758.png) ### 查看tag对应的commit号 ```shell # git log --pretty=oneline ${tag} git log --pretty=oneline v2.6.1 git reset --hard ${commitID} ``` # Git 撤销更改 ### 一、未使用 git add 缓存代码时 可以使用 git checkout -- filename (比如: `git checkout -- readme.md` ,不要忘记中间的 “--” ,不写就成了检出分支了!!)。放弃所有的文件修改可以使用 `git checkout . `命令。 此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。 ### 二、已经使用了 git add 缓存了代码 可以使用 git reset HEAD filename (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所以的缓存可以使用 git reset HEAD . 命令。 此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了如(一)所示的状态。继续用(一)中的操作,就可以放弃本地的修改。 ### 三、已经用 git commit 提交了代码 可以使用 git reset --hard HEAD^ 来回退到上一次commit的状态。此命令可以用来回退到任意版本:git reset --hard commitid ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302211211.png) 结果如上图所示,尽管commit了“bb“,仍然能够撤销"bb"这一内容 能否再次回到上述bb版本呢?结合下图,可以发现,这一撤销是真正永久的,不可回退的。 ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210302211734.png) # 分支 ### 创建并切换分支 `git checkout -b dev` ,等价于 创建分支`git branch dev` ,切换分支`git checkout dev` ### 查看当前分支 `git branch ` ### 归并冲突 `git merge dev` ### 删除分支 `git branch -d dev ` ### 实例 切换到了dev分支,并作出了一些修改,准备merge到master分支时,失败了 此时,git reflog检查记录时,发现master,dev版本不一致,所以选择先pull master保持版本一致。 ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20210303083737.png) >更正: 上图merge失败是因为冲突而不是commit版本不一致,需要解决冲突。应该没有在dev分支上git merge main的理由。 git merge 前,先要commit修改 ![](img/merge.jpg) git merge会保留dev分支的commit信息 ![](img/merge_simple.jpg) 创建分支的意义:比如在分支上处理bug, 然后与主线master开发任务并行,在分支bug解决后merge回主线。 # 标签 tag 是 Git 版本库的一个快照,指向某个 commit 的指针 ### 创建本地标签 git tag ${tagName}/v1.0.0 ### 推送到远程仓库 git push origin ${tagName} 或 git push --tags # 从远程仓库拉取 git fetch upstream master:dev 远程分支名:新建本地临时分支名 # git fetch [远程主机名] [分支名]:[本地分支] git log -p origin dev# 归并前先查看具体日志 git merge origin dev ``` git pull origin master ``` The `pull` command will do the `fetch` and `merge` for you in one step. # 团队协作 适用于团队合作的时候多个人向一个repo贡献,整理了Git从fork分支开始的过程。 ## 1. Fork 在github上你要贡献的repo(eg.http://github/**remote**/test.git)之后称上游仓库。点击fork,将上游仓库fork到你的github,之后称为远程库(eg.http://github/**chercher**/test.git) ## 2. Clone 选择本地文件夹,之后称为本地库 git clone http://github/**chercher**/test.git ## 3. 创建dev分支 进入文件夹中,创建dev分支作为你的开发分支,当你完成了这个开发分支的时候直接将这个分支的内容push到你的远程库。一般一个分支对应一个issue,开发完毕后即可销毁 git checkout -b dev 创建并切换至dev分支,是git branch dev + git checkout dev ## 4. 创建upstream分支 upstream分支是用于同步上游仓库的,可以同步其他人对上游仓库的更改 git remote add upstream http://github/**remote**/test.git 这时候用git remote 可以查看远程分支,git remote -v 可以查看具体路径 这时候应该有origin、upstream两种分支且分别有fetch和push的路径,origin是你的远程库,upstream是你的上游仓库 tips. 如果远程分支路径出错了,git remote set-url branch_name new_url 替换为具体的你的出错的分支名和新的路径即可 ## 5. 同步上游仓库 在提交自己的修改之前,先同步上游仓库到master git remote update upstream git rebase upstream/master 在不慎多次提交后出现 (master|REBASE 1/2), 解决办法: 回退提交,git rebase --abort ## 6. 修改文件push到远程库 对本地库进行修改后,git add changed_file & git commit -m"message" 添加文件到暂存区然后提交,写入相应信息。 git push origin dev:dev 这时你的远程库将会多出一个dev分支 git push <远程主机名> <本地分支名>:<远程分支名> ## 7. 提出pull request 这时候在你的远程库中点击create pull request,就可以等待别人review你的代码后merge入上游仓库了 ## 8. 合并commit 一个issue有时候并不是一次commit就可以完成的,这时候就涉及到洁癖患者们用rebase合并commit的过程了 第一次commit的时候并不需要做rebase的操作,rebase是将之后的多次commit合并到之前的一个commit当中 以第二次修改为例,在commit之后进行 git rebase -i HEAD~2 (git rebase -i dev) tips. 如果出现"Could not execute editor" 则设置 git config即可,git config --global core.editor /usr/bin/vim 之后再执行rebase命令,可以看到这两次的提交,现在状态都是pick。只选择第一个commit为p,其他的都为s,即把新的commit并入之前的。 修改完成后写入,然后自动跳转至另一个页面修改commit的信息 之后继续按照第6步push --force到远程库的流程进行就可以了~ Rebase之前看下commit日志 ![](img/before_rebase.jpg) 具体Rebase操作流程 ![](img/rebase.jpg) Rebase后发现合并了3个commit ![](img/after_rebase.jpg) ## 9提交pullRequest实践 ![](https://gitee.com/noyyh/picgo_image/raw/master/img/20211229140321.png) 首先fork王的test项目,生成了noyyh/test仓库。然后提交修改到noyyh/test仓库。 发起pullRequest请求,需要仓库源主人''王''进行审查,通过后进行代码合并。合并过程需要解决冲突 # 实战 - git status 查看文件状态,比如哪些文件被修改 - git commit 提交后,希望查看整体修改内容, 首先git log找到commitID, 然后git show commitID查看修改细节 - git diff 改动比较,git diff commitID ${filename}, filename是可选项,用于查看该commitID下的所有文件或某个文件的改动 ## 1 首先在gitlab上fork你要参与的git仓库,生成一个yehx/realRepo.git仓库 ## 2 git remote add yehx http://xxx.git , 然后git remote -v 发现yehx/realRepo.git和ultraSx/realRepo.git两个仓库,分别是一个远程仓库,一个上游远程仓库 ## 3 然后git branch查看分支(dev) ## 4 git push yehx dev:dev (先push到yehx远程仓库), 然后在gitlab中提交合并请求。 ## 提交前先要更新本地仓库,如何更新? ### 1 git remote -v 查看上游仓库upstream, git remote add upstream xxx.git (添加上游仓库,不必重复添加) ### 2 git fetch upstream 获取upstream仓库的更新 ### 3 git merge upstream/main dev (将上游仓库的main分支归并到本地的dev分支) 当然git merge upstream main dev也是正确的,但是不推荐这样用,因为考虑到git push的命令是git push origin [本地分支]:[远程分支],避免此种语法下git pull和git push的[本地分支]:[远程分支]的顺序上混淆。 ``` git merge upstream/main dev后需要重新commit吗,还是直接git push origin? 在执行"git merge upstream/main dev"命令后,如果合并过程中没有冲突需要手动解决,你可以选择重新提交(recommit)或者直接使用"git push origin"推送更改到远程仓库。 重新提交(recommit)可以让你在合并后的代码基础上进行一些修改,例如添加提交信息、修复冲突或者对代码进行微调。重新提交的步骤包括: 添加新的更改到暂存区(git add )或者撤销之前的更改(git revert )。 执行提交命令(git commit -m "")来创建一个新的提交。 然后再使用"git push origin"将更改推送到远程仓库。 直接使用"git push origin"推送更改,前提是合并后的代码没有冲突并且不需要进行额外的修改。这种情况下,Git会将合并后的提交直接推送到远程仓库。 需要注意的是,如果合并后的代码存在冲突需要手动解决,那么你应该先解决冲突,并将解决后的更改提交到本地分支中,然后再执行推送操作。 总结起来,重新提交和直接推送都可以将合并后的更改推送到远程仓库,具体选择哪种方式取决于你的需求和合并过程中是否发生冲突。 ``` # github person access token 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 (2023-4-1永久) git remote -v 没有输出, 于是 git remote add origin https://github.com/${github用户名teaCupxx}/gomodone git init, git add xx, git commit git push origin master 报错remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information. 配置令牌 在 setting-> developer settings-> personal access token -> add new token git remote set-url origin https://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@github.com/${github用户名teaCupxx}/gomodone.git