zoukankan      html  css  js  c++  java
  • git使用记录

    1 安装

    直接在官网下载最新版本

    https://tortoisegit.org/download/

    并可以下载相应的汉化包。

     tortoiseGit 在安装的时候选择默认的安装目录,汉化的时候就不会出现setting菜单汉化,但是右键无汉化的情况。

    如果在卸载过程中出现其它问题,可以考虑重启电脑解决

    一路next 安装完成

    git bash —— 自报家门 设置电脑的邮箱和用户名
    $ git config --global user.name "lxw-PC"
    $ git config --global user.email "wanmeishijie4113@163.com"

    $ git config user.name
    $ git config user.email

     使用

    git pull 获取并合并其他的仓库,或者本地的其他分支。

    git pull 与 git push操作的目的相同,但是操作的目标相反。命令格式如下:

    git pull <远程主机> <远程分支>:<本地分支>

    例如:

    git pull origin master:my_test

    上面的命令是将origin厂库的master分支拉取并合并到本地的my_test分支上。

    如果省略本地分支,则将自动合并到当前所在分支上。如下:

    git pull origin master

    基于库上代码,创建新的分支

    git checkout -b develop_td_utfp_0821 origin/develop_td_utfp_0821

    回退到上一次commit的状态

    git reset --hard HEAD^ 

    =========================
    版本库又名仓库 repository
    创建git版本库
    $ mkdir learngit
    $ cd learngit
    $ pwd
    /Users/michael/learngit
    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/

    git可以多次add
    git可以一次commit很多文件

    git diff 查看文件的不同
    比较工作区的内容和add的或者commit中内容的不同

    git log
    用来查看提交的历史记录
    精简查看
    git log --pretty=oneline

    回退到上一个版本

    $ git reset --hard HEAD^
    HEAD is now at e475afc add distributed


    上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

    git reflog
    查看每次提交的commit id 然后恢复
    git reset --heard 66f23a


    工作区 working directory
    工程目录的文件夹
    版本库 Repository
    工作区隐藏的.git目录


    git管理的是修改,而非文件。

    撤销修改
    git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
    把工作区的内容回退到最近一次git commit或者git add的状态。
    git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:


    删除文件
    命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

    推送到远程仓库
    ssh-keygen -t rsa -C "wanmeishijie4113@163.com"

    git remote add origin https://github.com/cs408/learngit.git
    git push -u origin master
    期间要输入git的用户名和密码
    git push origin master

    从远程仓库clone
    在github上创建远程仓库并初始化
    git clone https://github.com/cs408/gitskills.git

    创建与合并分支
    阅读: 999248
    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

    一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

    git-br-initial

    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:


    下面开始实战。

    首先,我们创建dev分支,然后切换到dev分支:

    $ git checkout -b dev
    Switched to a new branch 'dev'
    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'
    然后,用git branch命令查看当前分支:

    $ git branch
    * dev
    master
    git branch命令会列出所有分支,当前分支前面会标一个*号。

    然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

    Creating a new branch is quick.
    然后提交:

    $ git add readme.txt
    $ git commit -m "branch test"
    [dev b17d20e] branch test
    1 file changed, 1 insertion(+)
    现在,dev分支的工作完成,我们就可以切换回master分支:

    $ git checkout master
    Switched to branch 'master'
    切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

    git-br-on-master

    现在,我们把dev分支的工作成果合并到master分支上:

    $ git merge dev
    Updating d46f35e..b17d20e
    Fast-forward
    readme.txt | 1 +
    1 file changed, 1 insertion(+)
    git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

    当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

    合并完成后,就可以放心地删除dev分支了:

    $ git branch -d dev
    Deleted branch dev (was b17d20e).
    删除后,查看branch,就只剩下master分支了:

    $ git branch
    * master
    因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    Git鼓励大量使用分支:
    查看分支:git branch
    先切换到需要到的分支,然后再该分支上继续创建分支。
    创建分支:git branch <name>
    切换分支:git checkout <name>
    创建+切换分支:git checkout -b <name>
    合并某分支到当前分支:git merge <name>
    删除分支:git branch -d <name>
    ps:切换不同的分支,当前目录会显示不同的内容

    当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
    解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
    用git log --graph命令可以看到分支合并图。

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
    git merge --no-ff -m "merge with no-ff" dev


    复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

    开发一个新feature,最好新建一个分支;
    如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

    小结
    查看远程库信息,使用git remote -v;

    本地新建的分支如果不推送到远程,对其他人就是不可见的;

    从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

    在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

    从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

    使用标签
    命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    命令git tag可以查看所有标签。

    命令git push origin <tagname>可以推送一个本地标签;
    命令git push origin --tags可以推送全部未推送过的本地标签;
    命令git tag -d <tagname>可以删除一个本地标签;
    命令git push origin :refs/tags/<tagname>可以删除一个远程标签

    忽略某些文件时,需要编写.gitignore;
    .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

    #####

    1. git clone xxx.git

    从远程库中获取xxx库

    2. git pull

    更新本地git库,并自动合并本地代码(不可控)。

    例如:

    git pull origin master

    则是将远程的master库更新合并到当前的本地库

    3. git fetch

    更新本地git库,不执行合并。推荐使用本命令进行更新。

    例如:

        git fetch -f origin master

    则是将远程的master强制覆盖到本地库(如果本地库有修改,则会丢失这些修改)。

    利用本命令来更新本地git库比使用git pull命令更安全可靠。下面是具体的使用示例:

        git fetch origin master:tmp

        git diff tmp

        git merge

    这样,更新本地库代码时,合并操作将是可控的。

    4. git push

         将本地库的修改推送到远程库上。

         例如:

            git push origin XXX

         则是将本地库的XXX分支推送到远程库的XXX分支。

    5. git checkout

         将本地库切换到指定分支。

         例如:

             git checkout XXX

         则是切换到XXX分支

         此外,

             git checkout -B XXX

         则是创建一个新的分支XXX,并切换到这个分支。

    6. git branch

         查看本地库中存在多少个分支,并显示当前所处分支。

         此外,

             git branch -D XXX

         则是删除XXX分支。

    7. git log

         查看当前分支的历史修改记录。

    上面这几条命令是属于比较简单并且常用的命令,只要用几次就可以掌握。至于像其它的一些复杂些的命令,例如git add,则推荐使用图形界面软件(例如uDeck, TortoiseGit)进行处理,因为使用这些软件可以更方便地看出我们作了哪些修改,并选择提交哪些修改作为一个commit。

    特性交付时候使用技巧

    针对交付代码较多,从维护方便考虑,可以用分支来做区分

    在合入朱波杰的代码库后,基于当前分支拉取新的分支,

    第二次合入时候,只用把新修改的合入即可。

    也可以知道前后两次修改了什么

    问题记录

    本地向远端推送代码时候报错

    出现这个问题的原因是,本地和远端的信息未同步,可能是因为本地创建分支的原因

    解决方法:

    git lfs fetch --all

    一个本地分支commit了四次,然后push到orign(fork的仓库)上面,现在想把origin上面的commit改为1次:

    在本地使用重reset到两次commit之前的版本,重置类型选择混合,那么之前所作的修改还会保留。

    重置之后再本地commit,然后push到远端,勾选强制覆盖选项,就会看到远端的那个分支只有一次commit

    windows本地进行编辑修改,linux服务器进行构建编译。

    在本地使用小乌龟切新的分支,代码修改完成后push到origin。

    在linux服务器上执行

    //更新库上库到本地
    git remote update
    
    //切换到windows分支
    git checkout windows分支

    这样就可以实现windows修改 提交和pr。在linux实现同样代码的构建编译

     Unable to create '../.git/index.lock': File exists.

    常因为多个git操作,发生git锁住的情况

    git命令行进入到项目文件夹

    执行 rm -f ./.git/index.lock

    最好查看一下这个index.lock文件是否存在

    The following untracked working tree files would be overwritten by checkout

    删除未跟踪的文件

    git clean -d -fx

    可能很多人都不明白-d,-fx到底是啥意思,其实git clean -d -fx表示:删除 一些 没有 git add 的 文件;

        git clean 参数 

        -n 显示将要删除的文件和目录;

        -x -----删除忽略文件已经对git来说不识别的文件

        -d -----删除未被添加到git的路径中的文件

        -f -----强制运行

        git clean -n

        git clean -df

        git clean -f
    https://blog.csdn.net/lisulong1/article/details/78910727

    git cherry-pick xxx

    出现大量冲突,想回退,按如下操作解决

    git reset HEAD^
    
    git clean -d -fx
    
    git checkout .
    
    git status

    Permission denied

    $ git cherry-pick a6263e80
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    error: cannot stat 'code/source/driver/dpl/control/pts/fnpr_switch_central': Permission denied
    fatal: cherry-pick failed

    解决方法:退出编辑器、浏览器、资源管理器等,然后再切换就可以了。

  • 相关阅读:
    lnmp一键安装包,安装多版本php,并开启redis与swoole
    wangEditor的使用
    记一次傻逼的录入
    PHP自动加载
    pip升级
    Ubuntu安装mycli,让mysql命令行可以自动提示
    Redis存储AccessToken
    微信小程序生成太阳码
    巧妙的新订单提醒功能
    使用pt-query-digest进行日志分析
  • 原文地址:https://www.cnblogs.com/lixuwu/p/9281765.html
Copyright © 2011-2022 走看看