zoukankan      html  css  js  c++  java
  • git 常见的操作全解

    强烈推荐这个网站!!!里面有各种git工具、教程和常用命令的总结:

    https://gitee.com/all-about-git

    git 操作图解

    image

    配置

    # 设置提交代码时的用户信息
    $ git config [--global] user.name "[name]"
    $ git config [--global] user.email "[email address]"
    

    代码提交

    # 添加指定文件到暂存区
    $ git add [file1] [file2] ...
    
    # 添加指定目录到暂存区,包括子目录
    $ git add [dir]
    
    # 添加当前目录的所有文件到暂存区
    $ git add .
    
    # 提交暂存区到仓库区
    $ git commit -m [message]
    
    # 提交暂存区的指定文件到仓库区
    $ git commit [file1] [file2] ... -m [message]
    
    # 提交工作区自上次commit之后的变化,直接到仓库区
    $ git commit -a
    

    分支(branch)

    # 列出所有本地分支
    $ git branch
    
    # 列出所有远程分支
    $ git branch -r
    
    # 列出所有本地分支和远程分支
    $ git branch -a
    
    # 新建一个分支,但依然停留在当前分支
    $ git branch [branch-name]
    
    # 切换到指定分支,并更新工作区
    $ git checkout [branch-name]
    
    # 新建一个分支,并切换到该分支
    $ git checkout -b [branch]
    
    # 删除分支
    $ git branch -d [branch-name]
    
    # 删除远程分支
    $ git push origin --delete [branch-name]
    

    查看信息

    # 显示有变更的文件
    $ git status
    
    # 显示暂存区和工作区的差异
    $ git diff
    
    # 显示工作区与当前分支最新commit之间的差异
    $ git diff HEAD
    
    # 显示当前分支的版本历史
    $ git log
    
    # 显示指定分支的版本历史
    $ git log [branch-name]
    
    # 一行显示一次提交,commit-id只显示前7位
    $ git log --oneline
    
    # 一行显示一次提交,显示完整的commit-id
    $ git log --pretty=oneline
    
    # 以版本的结点树形式显示指定分支的版本历史
    $ git log --graph --oneline [branch-name]
    
    # 以版本的结点树形式显示指定分支的版本历史
    $ git log --graph [branch-name]
    
    # 说明:
    # --decorate 标记会让git log显示每个commit的引用(如:分支、tag等)
    # --oneline 一行显示
    # --simplify-by-decoration 只显示被branch或tag引用的commit
    # --all 表示显示所有的branch,这里也可以选择,比如我只想显示分支ABC的关系,则将--all替换为 [branch-name...]
    $ git log --graph --decorate --oneline --simplify-by-decoration --all
    

    远程同步

    注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。

    # 取回远程仓库的变化,并与本地分支合并
    $ git pull <远程库名> <远程分支名>:<本地分支名>
    
    # 如果远程分支是与当前分支合并,则冒号后面的本地分支名可以省略
    $ git pull <远程库名> <远程分支名>
    
    # 合并指定分支到当前分支
    $ git merge [branch]
    
    # git pull 命令等同于先做了git fetch ,再做了git merge。即:
    $ git fetch origin develop
    $ git checkout develop
    $ git merge origin/develop
    
    # 推送到远程仓库
    $ git push <远程库名> <本地分支名>:<远程分支名>
    
    # 如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
    $ git push <远程库名> <本地分支名>
    
    # 将目前自己本机的代码库推送到远端,并覆盖远程仓库的代码
    $ git push -f <远程库名> <本地分支名>:<远程分支名>
    

    push和pull的参考文章,这篇文章写得很全面,重点推荐!
    https://www.cnblogs.com/syp172654682/p/7689328.html

    理解冲突的产生

    记住:冲突的产生主要是由要合并的两个分支的结点树(一个结点对应一个commit)决定的,而不是由这两个分支的代码差异决定。
    尤其是本地push远程或者本地pull远程的代码时候,一定要仔细对比本地的结点树和远程的结点树,判断出冲突是否会产生!

    例一:

    如下图所示,由于master分支的结点树为A->B->C,而dev分支的结点树为A->B->C->D,显然两者的版本树没有冲突,直接把master指向dev的当前提交就完成了合并。(这里冲突并不会由C和D的代码差异引起,由于两者的结点树没有冲突,所以冲突就不会产生,最后合并后的结果指向的是D,不管D有没有修改或者删除C的代码)。

    合并之后可以把dev分支删除。

    image

    例二:

    如下图所示,由于master分支的结点树为A->B->C->D,而dev分支的结点树为A->B->C->E,由于结点树不一致,这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,这时候不能直接合并的时候就需要人工解决冲突,冲突解决之后,两者都合并到了F版本结点。

    合并之后可以把feature1分支删除。

    image

    版本回退

    # 首先查看需要回退的版本的commit id 
    $ git log
    
    # 根据id回退到指定的版本(本地回退)
    $ git reset --hard id
    
    # 推送到本地到远程仓库:让远程仓库代码和你本地一样,到当前你本地的版本。(远程回退)
    $ git push origin HEAD --force
    

    取消/重新提交上次的commit

    有时候我们提交(这里指的是commit)完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:

    $ git commit --amend
    

    这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。

    文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。

    例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

    # 第1次commit
    $ git commit -m 'initial commit'
    # 忘记add这个forgotten_file文件了
    $ git add forgotten_file
    # 修改第1次提交,执行这个命令之后会让你重新修改第1次commit时候的信息
    $ git commit --amend
    

    最终你只会有一个提交——第二次提交将代替第一次提交的结果。

    合并多次commit

    $ git rebase -i [commit_id]
    $ git push -f <远程库名> <本地分支名>:<远程分支名>
    

    具体详细的操作看这篇:https://www.jianshu.com/p/964de879904a

    注意:如果之前把这多次commit都已经push到了远程,而后来又是在本地把这多次commit进行合并成了一次,那么要注意此时远程的分支节点数和本地的肯定就不一样了,这时候肯定会有冲突,这时候如果在远程没有别人推送代码,则你可以使用push -f强制覆盖远程代码(如果有别人的代码,则要手动处理冲突,不能把别人代码覆盖了)。

    忘记切换分支,误将代码commit到了别的分支的解决方法

    情景如下:
    我的做法:git clone的master分支,修改之后commit到了master分支;
    正确做法:git clone的master分支,新建一个分支dev-myname并切换到该分支,修改之后commit到当前分支;
    现在的情况就是commit错了分支,怎么把master分支复原,并把原有的修改commit到dev-myname呢?

    # 1. 回滚提交 reset, 将最近一次提交放回暂存区, 并取消此次提交.
    $ git reset HEAD~1
    
    # 2. 将被跟踪的内容stash,即暂时将未提交的变化移除,稍后再移入
    $ git stash
    
    # 3. 创建并切换到新分支
    $ git checkout -b dev-myname
    
    # 4. 将stash的内容pop出来
    $ git stash pop
    
    # 5. 重新commit
    $ git add 多个文件名用空字符隔开
    $ git commit -m "提交信息"
    $ git push origin dev-myname 
    

    参考链接:

    廖雪峰 | Git教程 - 创建与合并分支:https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424

    廖雪峰 | Git教程 - 解决冲突:https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344

  • 相关阅读:
    TDirectory.GetParent获取指定目录的父目录
    TDirectory.GetLogicalDrives获取本地逻辑驱动器
    获取设置目录创建、访问、修改时间
    TDirectory.GetLastAccessTime获取指定目录最后访问时间
    TDirectory.GetDirectoryRoot获取指定目录的根目录
    「洛谷P1262」间谍网络 解题报告
    「洛谷P1198」 [JSOI2008]最大数 解题报告
    「洛谷P3931」 SAC E#1
    「UVA1328」「POJ1961」 Period 解题报告
    「博客美化」I 页面的CSS
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/15105297.html
Copyright © 2011-2022 走看看