git入门教程及常见错误

一 、分支、仓库(仓库)

在parrots2也就是外层目录下执行:git remote -v和git branch查看仓库和分支情况
在这里插入图片描述

每次执行一个任务就在master git checkout -b 新的分支名,自动切换到这个分支之后就开始写任务代码,写完之后既可以push到远程仓库,也可以在master分支git merge 分支名来讲任务代码分支与master合并,比较推荐的是git pull 远程仓库名 master,让master合并远程的最新代码,而不是自己将另一个分支的代码合并到master。
另:在~/.bachrc文件下插入代码:

function git_branch {
    
    
    branch="`git branch 2>/dev/null | grep "^\*" | sed -e "s/^\*\ //"`"
    if [ "${branch}" != "" ];then
        if [ "${branch}" = "(no branch)" ];then
            branch="(`git rev-parse --short HEAD`...)"
        fi
        echo " ($branch)"
    fi
}
export PS1='\[\033[01;32m\]$(git_branch)\[\033[01;36m\]\W\[\033[00m\] \$ '

每次打开终端时执行source ~/.bashrc可以高亮显示当前分支。

二、Git最新版本与本地合并(git fetch && git pull)

一般来说在push之前要先将远程仓库更新下来解决冲突,这个操作在master分支下进行:

  • Git fetch mine master(此处master是远程上的一个分支,可以省略,省略的话就取回全部mine仓库的分支)然后git merge FETCH_HEAD将拉去下来的最新内容合并到当前分支中
  • 或者,直接使用git pull:git pull mine master(这个master是远程上的一个分支):master(冒号后面的分支是让你决定更新到本地的哪个分支上,可以省略,省略的话就是更新到当前分支上)

三、 src/compute里不小心使用master提交而没有新建分支

  1. 先在master分支下git checkout -b cpr/operator新建cpr/operator分支,使得该分支保存最新的状态

  2. 再git checkout master切换到master分支然后:

    1. 先进入自己的仓库查看提交历史:
      在这里插入图片描述

    所以绿色框住的76f048a3是我们的目标版本号,执行git reset –hard 76f048a3,这样master版本就回退到此次任务操作之前的状态,要注意由于cpr/operator是在master分支回退之前建立的,所以它保留着master回退之前的写上了任务操作的状态。
    另:也可以使用git log查看这个仓库的提交历史,然后选取需要回滚的状态git reset -hard 长的commit号也能达到相同效果
    2. 然后git checkout cpr/operator切换分支,在cpr/operator分支执行那个git push mine cpr/operator。

  3. Push之后要撤销是git reset -hard 目标版本号,commit 之后要撤销是git reset –soft HEAD1,其中,HEAD^的意思是上一个版本,也可以写成HEAD1,如果你进行了2次commit,想都撤回,可以使用HEAD~2。–hard是撤销commit且撤销工作空间代码,–soft仅撤销commit不撤销工作空间代码。

四、内外模块pull与push

  • 当外面的主版本库pull了更新之后要让子版本库src/compute也更新才能版本同步使用python等工具,这就需要在外面版本更新以后执行git submodule update --init --recursive, 所有submodule都会被更新。
  • 提交时候先让内层的src/compute按照正常顺序提交,然后退出到外层指定分支后进行commit时需要在commit信息的末尾加上[compute:姓名全拼]表示外层在拉取的时候是拉取自己仓库的compute而不是其他人的子版本模块,这样才能让自己的修改内外匹配上。

五、在chenpeiru/xxx分支写cpr/doc需要的代码并提交

这个时候就需要手工迁移了,切记不要直接在cpr/doc分支 git merge chenpeiru/xxx分支,这会将后者的所有记录都迁移到该分支,不符合每个分支只进行一个任务的原则。需要从master git checkout cpr/doc之后进行修改提交之后,将chenpeiru/xxx进行版本回退,回退到master的状态,回退方法和上面3.是一样的。

六、master分支与其他分支的关系:

在master分支下touch 2.txt并提交
在cpr/test分支下touch 3.txt并提交
在master分支下touch 4.txt但是不提交
git checkout cpr/test
在cpr/test分支下touch 5.txt但是不提交
git checkout master

  • (cpr/test)下ls:发现3.txt 4.txt 5.txt
  • (master)下ls发现2.txt 4.txt 5.txt
  • 在master下git commit 5.txt回到cpr/test发现5.txt没有了
  • 在cpr/test下git commit 4.txt回到master发现4.txt没有了
    结论:分支间切换会带走未被提交的修改文件,一旦在一个分支提交,该文件就属于提交的分支,其他分支就没有了。

在gitlab上的cpr/dist提交merge request,同意合并到master后,

  • (cpr/test)下git pull mine master/cpr:test发现有2.txt 3.txt 4.txt 5.txt
  • 这个时候直接切换到master分支发现还是只有2.txt 5.txt
  • Master分支也需要git pull mine master:master才能更新到最新的版本。
    结论:pull只更新指定分支,无论是master分支还是其他分支都需要手动更新。

七、合并冲突

git fetch origin
git merge master(也可以指定当前分支)
git status(查看冲突文件)
进入冲突文件修改合并冲突
git add 文件
git commit 文件
git push mine 当前分支名

八、正常步骤

git fetch origin master
git merge master(或这两步合并成git pull mine master)
git checkout 任务分支
编写任务代码
git status查看修改代码
git add 添加修改代码 git reset HEAD xxx文件名撤销
git commit提交修改代码到本地仓库 git reset –soft HEAD~1撤销提交
git push mine 当前分支名

九、参考

Git恢复之前版本的两种方法reset、revert
分支的概念以及fetch与pull的区别
Git submodule与切换分支
Git checkout 与切换分支
Git add的撤销

猜你喜欢

转载自blog.csdn.net/s11show_163/article/details/107693338