【Git】3.git常用命令(结合提交/拉取代码)

前言:

        跟git交互有好多场景,比如第一次推送代码;第一次拉取git上已有的项目;修改代码推送解决冲突;代码提交错误会滚等。接下来就结合场景来学习git命令吧~

目录:
        前提:

                在下列场景操作时的前提是需要先配置好git全局用户名和邮箱,在git上配置SSH 公钥实现免密登录。具体配置已在文档里面第2,3点阐述:【Git】第一次推送代码到gitLab-CSDN博客

                                                                正常场景如下:
场景一:目前在Git上没有项目,第一次推送项目

​​​​​​【Git】第一次推送代码到gitLab-CSDN博客

场景二: Git上有项目,本地无该项目需要克隆项目并自动生成一个本地仓库
步骤1: 想要将项目放在桌面Desktop

        cd ~/Desktop

步骤2: 克隆项目到桌面

        git clone <此处为项目的SSH地址>
场景三:修改代码并推送
前提:切换到master分支先拉取最新代码 
    git pull origin master

一般不直接在master分支上改代码,需要额外创建自己的本地分支

步骤1: 克隆项目打开后,会默认在本地master分支上。先查看本地所有分支,其中分支为绿色且跟*代表当前所在分支

        git branch


步骤2:需要创建新分支ha并切换

        方式一: 创建并切换到新分支  git checkout -b ha
        
        方式二: 先创建新分支  git branch ha
                后切换分支   git checkout ha
步骤3:在新分支ha上修改代码进行推送
 

    #将工作区所有改动的文件添加到暂存区
    git add . 

    #将暂存区的文件推送到本地仓库
    git commit -m "此处为commment" 

    #查看工作区文件的状态: 
         untracked file 即新建文件未跟踪->pycharm显示文件为红色
    
         working tree clean 即文件在暂存区待提交->pycharm显示文件为绿色
         Changes not staged for commit即commit过&文件发生修改但未暂存->pycharm显示文件为蓝色
         Changes to be committed即文件已暂存,下次提交

    git status 


    #将本地仓库代码推送到远程仓库
    git push origin ha  

步骤4: 发起merge request而后审批通过

步骤5: 切换本地分支到master

        git checkout master

步骤6: 拉取最新代码

        git pull origin master

步骤7: 查看远程仓库,应该有master和ha

    git branch -r

步骤8: 以行查看最近提交的3条日志,会有commit哈希值和当前head指向和远程仓库的commit

    git log -3 --oneline
            
                                                        异常场景如下:
场景一删除(针对工作区的处理):git rm  相当于rm和git add
所有场景的前提: hello.py文件commit过到本地仓库即被跟踪的文件
-------------------------------------------------------------
场景1:某个py文件需要下掉不再使用,就需要删除工作区文件并且推送到本地仓库更新版本库

前提:文件未发生修改即 当前工作区的文件内容同当前版本库的内容一致

步骤1: 删除工作区的文件并将该文件添加到暂存区

        git rm hello.py

步骤2: 查看文件状态: Changes to be committed: deleted hello.py

        git status

        

步骤3: 推送到本地仓库

        git commit -m "此处为comment"


最终: 当前版本库的文件和工作区文件保持一致


-------------------------------------------------------------
场景2: 同场景1
前提:文件发生修改

步骤1: 强制删除工作区的文件并将该文件添加到暂存区

        git rm -f hello.py

步骤2: 推送到本地仓库

-------------------------------------------------------------
场景3: 某个py文件不希望被提交,仅在工作区使用.比如日志文件,缓存文件/误提交,想要从版本库删除
解决方案: 使用.gitignore文件添加需要忽略的文件
步骤1: 删除文件

        git rm --cached hello.py

步骤2: 查看文件状态

        git status  
        # Changes to be committed: deleted hello.py 需要commit的
        # unpacked file: hello.py 被取消退回工作区即未被跟踪

步骤3: 推送到本地仓库会更新版本库

步骤4: 查看工作区文件还在

场景二撤销(针对暂存区的处理):git restore  --staged
-------------------取消暂存区的文件----------------
步骤1: 将hello.py, myapp.ini文件添加到暂存区

        git add .

步骤2: 想要将hello.py其从暂存区撤回

        git restore --staged hello.py

步骤3: 核对该文件状态

        git status  # Untracked files: hello.py且该文件在pycharm显示红色

步骤4: 所有暂存区的文件都取消

        git restore --staged .


-------------------修改暂存区文件内容但未重新暂存,想要撤回工作区的修改---------------
步骤1: 将hello.py添加到暂存区

        git add .

步骤2: 对该文件进行修改


步骤3: 查询本地仓库文件状态,简洁展示为: M hello.py  即modified hello.py

        git status -s

步骤4: 撤回修改

        git restore hello.py

-------------------修改暂存区文件本身(删除文件)但未重新暂存,想要撤回修改---------------

场景三重置(针对本地仓库处理):git reset  --options <目标commit 哈希值>
--------------------(谨慎操作)工作区删除,暂存区删除,本地仓库&远程仓库删除------------------
步骤1: 新增hello.py文件并添加到暂存区

        git add .

步骤2: 推送到本地仓库

        git commit -m "此处为comments"

步骤3: 推送到远程仓库

        git push origin master


步骤4: 查看已经提交的commit记录
        
        git log --oneline  # 行形式查看未删除的commit,会有commit的哈希值和HEAD指向
        # 假设当前已经commit的记录有如下:

        234dr  (HEAD->master,origin master)hello.py
        1e2d3  addFile.py

步骤5: 撤回并删除hello.py文件
        
        git reset --hard 1e2d3

步骤6: 查看HEAD当前指向的commit

        git log --oneline

        # 当前已经commit的记录如下:

        1e2d3  (HEAD->master)

reset操作会导致本地仓库和远程仓库的版本不一致,后续push也会有问题
        解决办法:
        git reflog  # 查看所有分支的操作记录(包括已删除的commit和reset),找到删除的commit哈希值

步骤8: 再次使用reset恢复


        git reset --hard <被删除的commit哈希值>




-----------------------2.工作区删除,暂存区删除,本地仓库回滚到指定commit---------------
步骤1: 新增hello.py文件并添加到暂存区

        git add .

步骤2: 推送到本地仓库

        git commit -m "此处为comments"

步骤3: 查看未被删除的commit记录以及当前HEAD

        git log --oneline
        
        # commit列表:
        8b9c1c3 (HEAD -> master) hello.py
        0d64047 (origin/master) fix

步骤4: 回退到上一个commit即撤回并删除提交到本地仓库的文件hello.py

        git reset --hard 0d64047


---------------------3.工作区保留,暂存区保留,本地仓库回滚到指定commit-------------------
步骤1: 新增hello.py文件并添加到暂存区

        git add .

步骤2: 推送到本地仓库

        git commit -m "此处为comments"

步骤3: 查看未被删除的commit记录以及当前HEAD

        git log --oneline
        
        # commit列表:
        aa9825a (HEAD -> hmx) hello.py
        b19a398 bcde.py
        31ec1be bce.py


步骤4: 回退到上一个commit

        git reset --soft b19a398

步骤5: 再次查看提交日志

        # commit列表:
        b19a398 (HEAD -> hmx) bcde.py
        31ec1be bce.py

步骤6: 查看文件的状态都为:Changes to be committed

--------------------4.工作区保留,暂存区文件取消,本地仓库回滚-------------------

步骤1: 新增hello.py文件并添加到暂存区

        git add .

步骤2: 推送到本地仓库

        git commit -m "此处为comments"

步骤3: 查看未被删除的commit记录以及当前HEAD

        git log --oneline
        
        # commit列表:
        aa9825a (HEAD -> hmx) hello.py
        b19a398 bcde.py
        31ec1be bce.py


步骤4: 回退到上一个commit

        git reset --mixed b19a398

步骤5: 再次查看提交日志

        # commit列表:
        b19a398 (HEAD -> hmx) bcde.py
        31ec1be bce.py

步骤6: 查看文件的状态都为:Untracked files
场景三(针对本地仓库恢复):revert

场景四:隐藏(切换分支,隐藏工作区/暂存区的文件):git stash 

                git有多个提交区,提交之后切换分支不会受到影响

                但git只有一个工作区和暂存区,文件在工作区/暂存区切换分支会受到影响

---------------commit之后切换分支--------------------------------
步骤1: 新增hello.py文件并添加到暂存区

        git add .

步骤2: 推送到本地仓库

        git commit -m "此处为comments"

步骤3: 切换到分支B,看不到hello.py文件


        git checkout B

----------------暂时不想commit切换分支也不希望其他分支受到影响--------------

步骤1: 分支A下新增hello.py文件添加到暂存区; world.py文件在工作区

步骤2: 隐藏工作区和暂存区的上述2个文件

        git stash save "此处为备注,方便恢复时查找"

步骤3: 切换到分支B,看不到2个文件

步骤4: 切换到分支A,列出隐藏工作现场的文件list

        git stash list  # 比如 stash@{0}: On A: hello.py&world.py

步骤5: 恢复工作现场并删除隐藏记录


        git stash pop stash@{0}

----------------在工作区直接切换分支----------------------

步骤1: 在当前分支A下新增hello.py文件

步骤2: 切换到分支B, 也可以hello.py文件


---------------暂存区直接切换分支------------------------

步骤1: 在当前分支A下新增hello.py文件

步骤2: 将文件添加到暂存区

步骤3: 切换到分支B, 也可以hello.py文件

场景五:git checkout
总结
(1)会碰到的报错:
        1. 拉取远程仓库代码的时候

        报错:fatal: Need to specify how to reconcile divergent branches.

        解决:

        2. 推送代码的时候

        报错: ! [rejected]        master -> master (non-fast-forward) error: failed to push some refs to 'gitee.com:xxx'

        原因排查:

                排查1: 进行reset后,git版本不一致导致的

                解决1: 使用 git reset --hard <此处为误删除的commit的哈希值>,操作该命令再进行push

        3. 代码推送到本地仓库后,切换分支

        报错:error: Your local changes to the following files would be overwritten by checkout:
        x x.py
                        Please commit your changes or stash them before you switch branches.
                        Aborting

        原因: 

(2)reset,revert,checkout的区别

你可能感兴趣的:(git)