• Git 命令及分支管理学习



    廖雪峰git教程学习

    参考链接:廖雪峰git教程

    版本回退:

    • git reset --hard HEAD^20
      • HEAD之前20个版本
      • --hard 撤消commit与对应的更改
      • --soft 撤消commit
    • git reflog
      • 查看操作历史记录

    暂存区(stage or index):

    • git add

      • 将"文件修改"添加到暂存区
    • git commit

      • 将暂存区所有内容提交(移动?)到当前分支
    • git diff HEAD -- a.txt

    • git checkout -- a.txt

      • 将a.txt文件在__"工作区"__的修改全部撤销
      • 撤销到和 版本库(修改没被放到暂存区)/暂存区(修改已经添加到暂存区) 一样的状态
      • 让a.txt回到最近一次git commit/ git add时的状态(会丢失最近一次提交后修改的内容)
      • 命令中的"--"
    • git reset HEAD a.txt

      • 将__"暂存区"__的修改撤销掉(unstage)
      • HEAD 撤销到最新版本
    • 引用原作一段话

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作
    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库
    

    删除:

    • rm a.txt
      • git rm a.txt (+ git commit)从版本库中删除该文件
      • git checkout -- a.txt 恢复误删的a.txt (把误删的文件恢复到最新版本)
      • git checkout 用__版本库__里的版本替换__工作区__的版本

    远程仓库

    • 本地Git仓库和github仓库之间的传输是通过SSH加密的
      • ssh-keygen -t rsa -C "xxx@yyy.com
    • 新建仓库+推送
      • git remote add origin git@github.com:yourname/XXX.git
      • 远程库的名字为origin
      • git push -u origin master 第一次推送master分支的所有内容
      • git push origin master
    • 新建仓库+克隆
      • git clone git@github.com:yourname/XXX.git

    分支管理

    • 概念

      • HEAD -> master -> 提交
      • 每次提交 master 分支都向前移动一步
    • 分支操作命令

      • git checkout -b dev
      • git checkout master; git merge dev
      • git merge 合并指定分支到当前分支
      • Fast-forward模式 当删除被合并的分支后,git log中丢掉__是从这个分支合并__的信息
      • 禁用--no-ff 禁用后 Git会在merge时生成一个新的commit
      • 普通模式合并,能看出来曾经做过合并,git log 中有merge分支的信息
      • git branch -d dev
    • 带参数的git log

      • git log --graph --pretty=oneline --abbrev-commit
      • git log --graph
    • stash

      • 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
      • 从某个分支退出,但不想commit时:
      dev分支 git stash
      git checkout master
      do some thing
      git checout dev
      git stash list
      git stash pop
      或者 git stash applay xxx / git stash drop xxx
      
    • 删除未被合并的分支

      • git branch -D XXXX
    • 推送/抓取分支

      • git push origin dev
      • 拉取远程dev分支并创建本地dev分支 git checkout -b dev orgin/dev
      • git branch --set-upstream-to=origin/dev dev
      • git pull ( git pull origin dev )

    标签

    • 概念
      • 标签是指向某个commit的指针
      • git show
      • git tag -a / -d
      • 删除远程标签,先从本地删除,然后 git push origin :refs/tags/

    自定义git

        git config --global alias.st status 
        git config --global alias.co checkout
        git config --global alias.ci commit
        git config --global alias.br branch
    
    • 配置文件
        $ cat .git/config 
        [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
        [remote "origin"]
        url = git@github.com:michaelliao/learngit.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        [branch "master"]
        remote = origin
        merge = refs/heads/master
        [alias]
        last = log -1
    

    git 使用总结

    git fetch / pull 区别

    git常用命令

    • 更新代码
      • git fetch --all (fetch all remotes)
      • git push origin remotes/upstream/master:master -f
        • 将fetch下来的remotes/upstream/master分支push到origin远程仓库master分支上,省略了merge的commit
        • git branch -va查看fetch后的结果
      • git reset --hard HEAD~20
      • git checkout master
      • git pull (将最新代码拉取到本地)
    • 需要保存未提交的内容
    • git commit --amend --no-edit
    • 还原某个特定文件到某个版本
      • git checkout commit-id xxx.cpp

    git相关工具

    • tig

    配置git使用https方式操作

    git config --global user.name "username"
    git config --global user.email "useremail"
    git config --global http.sslverify "false"
    vi ~/.git-credentials #添加https://username:passwd@addr.com<:port>
    git config --global credential.helper store
    

    配置gitlab中的SSH key

    • cd ~; ssh-keygen -t rsa -C "your_email@youremail.com"
    • cat /Users/admin/.ssh/id_rsa.pub
    • 将公钥粘贴到gitlab-setting-SSH keys中
    • 但git clone git@.....git发生错误(可能由于服务器未开放22端口)
    tmp $git clone git@XXX.com:WWW/YYY.git
    Cloning into 'YYY'...
    ssh: connect to host XXX port 22: Operation timed out
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    
    • 添加如下配置
    tmp $cat ~/.ssh/config
    Host gitlab
        Hostname XXX
        Port 8021
        User git
    
    tmp $cat /etc/hosts
    ##
    # Host Database
    #
    # localhost is used to configure the loopback interface
    # when the system is booting.  Do not change this entry.
    ##
    127.0.0.1	localhost
    255.255.255.255	broadcasthost
    ::1             localhost
    10.120.16.22	XXX
    10.120.16.22	gitlab
    

    合并多次push的commit

    • git rebase -i HEAD~3
    • git status
    • git push origin master -f
    • git status pop

    提交a分支到远程的b分支

    对比不同版本之间代码

    • git reflog
    • git diff old_commit_id new_commit_id

    修改未push的commit

    • git commit --amend

    将在master分支修改的内容切换到refactor分支

    • git stash
    • git checkout refactor
    • git stash pop, 这一步会发生冲突,产生需要解决冲突的文件,但此时并没有执行git stash drop,所以可以执行如下步骤
    • git checkout master -f
    • git pop,此时恢复到了最初的在master上完成开发的状态
    • git stash
    • git pull origin master
    • git checkout refactor
    • git merge master
    • git stash pop

    取消git add的文件

    • git reset HEAD a.cpp
    • git reset HEAD . 取消所有add的文件

    取消git commit的文件

    • git reset --soft HEAD~1

    分支A已经merge到master,之后因其他需求git revert这个merge,然后master有若干merge其他分支操作(最终并不需要这些操作),然后需要再次将A分支(最开始要merge的内容或者还有新内容都)merge到master

    先后将分支A、B merge到master,之后发现A有问题

    • 先将已merge的B分支revert
    • 然后在A分支做修改,再次提交merge request并merge
    • cherry pick 后来merge的B分支并merge

    《Git 学习指南》笔记

    git仓库的三个概念

    工作区 working tree/working directory

    • 用户的增删改发生在工作区
    • git status查看当前工作区中所发生的修改

    暂存区 index/staged snapshot

    • 又叫缓存区、索引
    • git add 将增删改注册到暂存区
    • git add -i 中选择patch,然后选择e可以按行将修改注册到暂存区,有关manually edit the current hunk,可以参考 edit-your-hunk
      - 主要是要修改header部分如:@@ -9,6 +9,12 @@,它代表原来是从第9行开始后面6行,现在从第9行开始后面12行,才到达相同内容的行,如果这个hunk全部提交就是这样,如果只提交一部分,那就要相应修改+后面的行数

    版本库 commit history

    • git commit 将暂存区中的修改传送到版本库

    常用git命令

    git diff <a.cpp>

    • 不带任何选项的情况下,显示的是 暂存区 与 工作区 之间的不同
    • 加上 --staged,显示 当前版本库中HEAD提交 与 暂存区 之间的不同

    git reset

    • 操作 commit
      • reset (--mixed) commit
        - 将 index 和 commit history 重置为commit版本
      • reset --soft commit
        - 将 commit history ......
      • reset --hard commit
        - 将 working dir 和 index 和 commit history ......
    • 如果修改了 commit history,提交到远程分支可能会报错,因此 reset 通常用来恢复本地的修改与提交
      • 修改commit history 即修改HEAD指针
    • 操作 file
      • reset commit file
        - 将 index 中 file 更新为 commit 版本的 file

    git checkout

    • 操作 branch
    • 操作 commit
      - 会覆盖 working dir 和 index 和 commit history 中的文件
      - detached HEAD
      - 待补充
    • 操作 file
      -checkout commit file
      - 将 working tree 中 file 更新为 commit 版本的 file

    git revert

    • 会生成新的 commit,恢复后的代码,可以直接提交到远程分支,通常用来恢复远程的提交
    • 只可操作 commit
    • You can also think of git revert as a tool for undoing committed changes, while git reset HEAD is for undoing uncommitted changes
    • 会覆盖 working dir 和 index 和 commit history 中的文件

    git stash

    • 将 工作区 和 暂存区 中的修改保存在 储藏栈(stash stack) 中
    • git stash save "at a.cpp"

    合并与变基

    分支模式

    Git-Flow模式

    Github-Flow模式

    Gitlab-Flow模式

    待补充

    参考

    Resetting, Checking Out & Reverting
    What's the difference between git reset --mixed, --soft, and --hard?
    https://git-scm.com/docs/git-reset
    Merging vs. Rebasing
    Git 分支 - 变基
    如何选择 Git 分支模式
    git http方式免密提交

  • 相关阅读:
    Python开发之路
    openstack系列阅读目录
    linux基础
    PEP8规范
    我真的还是18岁的那个我
    为什么很多IT公司不喜欢进过培训机构的人呢?
    GRE与VXLAN
    VLAN模式
    网络虚拟化基础一:linux名称空间Namespaces
    四:OVS+GRE之网络节点
  • 原文地址:https://www.cnblogs.com/wangzhiyi/p/9164920.html
Copyright © 2020-2023  润新知