zoukankan      html  css  js  c++  java
  • git常用命令行

    一、git安装之后的先配置环境变量

    1 git version #查看git的版本

    1 git config --global user.name "vhjmhk" #设置全局使用者名称
    2 git config --global user.email "vhjmhk@163.com" #设置全局使用者邮箱
    cat ~/.gitconfig #可以去家目录的.gitconfig 文件里面查看git的配置


    二、git建立仓库

    1 git init #初始化一个新的git仓库,默认初始化一个master 的分支

    1 git status #查看git仓库状态

    提示存在一个没有路径的文件test.sh,git不知道该如何去去处理这个新文件,master隔壁多了一个*,git提示可以使用 git add <file>... 命令来添加这个文件

    1 git add test.sh #可以将新文件暂存起来
    2 git add -A #一次将目录下所有的文件缓存起来

    提示产生了一个新文件test.sh,git提示可以使用 git rm --cached <file>... 来删除缓存区的文件

    1 git rm --cached test.sh #可以把缓存区的文件删除

    1 git commit -m 'annotation' #将缓存区的文件提交到本地的git仓库中,-m后面跟此次改动的注释

    而且*也随之消失

    1 cat .git/index #git缓存区的文件保存记录

    1 git remote add origin https://github.com/vhjmhk/git-tutorial.git #连接到远端的github仓库(http的方式),默认远端的仓库的名字为origin(约定俗成的名字)
    2 git remote -v #查看已连接的远端仓库,我们可以fetch,push来推和拉

    1 git push origin master -u #将本地的git仓库里面保存的文件

    git push 远端仓库名字 分支
    -u是设置成默认的远端仓库,下次要使用的时候,直接使用 git push 即可
    有时候需要输入密码,可以做ssh免密校验

    1 git push origin feature1 #可以将feature1分支保存到远端的仓库上
    2 git push origin feature1:f1 #将feature1分支在远端保存为f1分支
    3 git push origin :feature1 #删除远端feature1分支

    1 git clone https://github.com/vhjmhk/git-tutorial.git git-clone #从远端的GitHub仓库克隆一个库下来,并设置本地库名为git-clone,不输入库名,默认和远端库名字一样,即git-tutorial

    git checkout -- <file>... 将文件还原到上一个状态

    修改文件并传到远端仓库

    git pull 拉取到远端的代码,将远端库的代码拉取到本地

    1 git pull origin master

    三、git分支操作

    git branch feature1 #建立一个名字是feature1的分支,名字可以自己起

    1 git checkout feature1 #切换到feature1的分支里面

    1 git checkout -b feature2 #在分支一里面创建一个新的分支,并切换到新的分支里面去

    1 git branch -d feature2 #删除一个feature2的分支


    因为feature2里面还有新文件没有同步到master里面,所以git不允许我们删除feature2分支,也可以使用  git branch -D feature2  来强制删除,一般在git里面都是比较慎重的选项

     git merge feature2  将feature2分支的文件合并到master(当前分支里面)将master的指针指向feature2

     

    四、git合并

    1 git log #查看git的操作日志

    --oneline 以一行的形式来显示,看起来比较短小
    git log --oneline -3 只输出前3行的数据

    1 git show 1333068 #查看某一次修改的具体操作

    常用的可视化管理log参考:https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs

    可视化来管理log
    在~/.gitconfig 文件里面加入别称

    root@controller01 ~/git-tutorial [master]
    ± # cat~/.gitconfig
    [user]
    name = vhjmhk
    email = vhjmhk@163.com
    [alias]
    lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
    lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
    lg = !"git lg1"
    dog = log --all --decorate --oneline --graph

    使用  git lg /git lg1 

    使用  git lg2 

    使用  git dog 

     


    git merge feature1 使用merge的方式来合并的时候,默认使用Fast-forward,不会产生新的分支,前提是没有冲突
    可以使用  git merge feature1 --no-ff  会创建一个新的合并节点,在我们合并的同时产生一个新的commit的提交,可以保持原有的开发分支,整个提交链的完整性。会产生一个新的分支,可以看到比较完整的先后路径

    git rebase 将feature分支移动到到master分支的最后一次提交,把master最后的操作同步过来,使用rebase可以持续的保持一条竖线,保持整洁,但是会带来一些安全和可跟踪性问题。

    注:绝对不要在公共的master分支上使用rebase

    merge是一个合并操作,它会将两个分支的修改合并在一起,默认中是不会提交合并中修改的内容的,merge的提交历史会被记录,注重的是提交记录的真实性。
    rebase是没有合并操作的,他只是将当前分支的修改复制到目标分支的最后一次提交上面,关注点是开发的过程,rebase的log可以反应这个过程发生了什么
    可能使用merge会多一些

    分支冲突


    可以使用 git mergetool 

    推荐使用 vimdiff 来进行比较

    修改完成后

    a.txt.orig 是冲突产生时的临时文件,不需要保存
    提交修改并查看log

    会产生一些弯曲的线条
    实际情况下,其实合并其实还是会使用工具完成的

    五、Git回滚和撤销

    在提交操作完成之后,突然又不想要这个文件,想回到上一个版本的状态

     git reset master^  将git仓库回归到上一次的版本的状态,回退两次可以使用  git reset master^^  ,回退n次,可以使用  git reset master~n  ,可以回到前n次,这属于相对撤销的方式,也可以使用  git reset --hard HEAD^  功能一样

    文件依然存在,但是没有被git托管

    git reset 7f0abc2 在后面加版本号可以回到该版本,这属于绝对撤销


    常用的选项
    --soft 这个模式下的reset,工作目录和暂存区的文件都不会被丢弃,只是移动了commit指针而已
    --mixed 这个模式会把暂存区的文件丢弃,但不会动到工作目录的文件
    --hard 这个模式下,工作目录以及暂存区的文件都会被丢弃

     git reflog  还可以查看之前回退之前的版本(在git log里面看不见),在回退之后,还可以再次回退到回退之前的版本

    git revert 可以撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。

    使用  git log  查看日志

    产生新的注释

    git revert 撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。相比 git reset,它不会改变现在的提交历史。
    在master的分支上应该使用revert,将记录保留下来,可以回溯。
    在自己的分支上,可以使用reset来直接回退。

    六、ignore和fork


    有一些.idea、.settings和.classpath 等无用的硬盘配置文件、编译生成的中间文件、可执行文件、敏感的配置文件和本地不想提交的脚本文件,都不需要同步,需要忽略掉它
    先创一个 .gitignore 文件
    在里面写入你要忽略文件的条件,而且你要忽略的文件不可以被git托管,如果被托管你需要手动撤销掉

    https://www.gitignore.io/ 可以自动生成 .gitignore 文件,输入相应的语言(如:java、python)即可生成相应的,应当忽略的文件

    1 git remote add upstream https://github.com/jobbole/awesome-java-cn.git #设置上游仓库
    2 git fetch upstream (分支) #将远端的上游仓库的某一个分支的代码拉到本地,默认是master分支

    pull = fetch + merge pull会自动合并

    1 git branch -r #可以查看远程的分支upstream/master
    2 git rebase upstream/master #要更新远端fork仓库的数据,没有自己的修改,只用rebase就够了,如果你有自己的贡献,就需要使用merge来合并分支

    七、GitHub的ssh免密推送

    官方文档
    https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent

    1. 开启终端

    2. 粘贴下面的文本,替换您的GitHub电子邮件地址。

      $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

      这将使用提供的电子邮件作为标签创建一个新的ssh密钥。

      > Generating public/private rsa key pair.
    3. 系统提示您“输入要保存密钥的文件”时,按Enter键。使用默认文件位置。

      > Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]
    4. 在提示符下,键入安全密码。其实可以不使用密码,有一些应用可能需要写入密码

      > Enter passphrase (empty for no passphrase): [Type a passphrase]
      > Enter same passphrase again: [Type passphrase again]

    将SSH密钥添加到ssh-agent

    在将新的SSH密钥添加到ssh-agent以管理密钥之前,您应该检查现有的SSH密钥生成新的SSH密钥

    1. 在后台启动ssh-agent。

      $ eval "$(ssh-agent -s)"
      > Agent pid 59566
    1. 将SSH私钥添加到ssh-agent。如果使用其他名称创建密钥,或者要添加具有不同名称的现有密钥,请将命令中的id_rsa替换为私钥文件的名称。

      $ ssh-add ~/.ssh/id_rsa
    2. 将公钥里面的文件复制到GitHub的新建ssh选项中
  • 相关阅读:
    iPhone网络编程之--Reachability
    ASIHTTPRequest 详解, http 请求终结者2
    什么情况下使用break关键字? 什么情况下使用Continue关键字? Java如何声明一个数组?JS如何声明一个数组?如何获取数组长度? 如何遍历数组?
    说说三元运算和if...else的相同之处? Switch语句的条件只能接受什么类型的值? 说说do...while和while的区别? 说说for循环的两种写法?
    String类的常用方法
    逻辑结算的结果是什么类型? 比较运算的值是什么类型? 声明字符串有哪几种方式?怎么写? Math类有哪些常用的方法? 三元运算怎么写?
    算术运算有哪些?逻辑运算有哪些?比较运算有哪些?
    Java中8种基本数据类型是哪些?
    Java如何声明变量?JS如何声明变量?
    回顾之前知识: 注释
  • 原文地址:https://www.cnblogs.com/nobushi/p/10751052.html
Copyright © 2011-2022 走看看