• Git使用


    git clone和fork的区别
    1.区别
    git clone 是在自己电脑(这里我是ubuntu)直接敲命令,结果是将github仓库中的项目克隆到自己本地电脑中了
    fork是直接访问github网站,在项目页面中点击fork,然后自己github项目中就会多出一个复制的项目
    2.用法
    如果我们想要修改他人github项目的话,我们直接git clone代码到本地是不能pull的,所以我们使用fork,先把代码复制到自己的github仓库,然后git clone到本地修改,然后在提交pull(这里的pull是pull到自己github仓库了,我们自己的github仓库中的代码是fork源的一个分支),这时候我们想要把修改的代码提交给他人的话,就可以在自己github上pull,等其他人看到后就可以把代码做一个合并
     
    安装git后配置git:
    $ git config --global user.name "Your Name"        //github账号(这里最好用姓名+员工号)
    $ git config --global user.email "email@example.com"    //github邮箱(公司邮箱)
    注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
     
     
    使用远程仓库所需的配置(即添加ssh-keys):
     
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
     
    先说几个名词 未被追踪的文件:指的是新建的文件或文件夹且还没加入到暂存区(新建的还没有被git add 过得) 未加入到暂存区的文件:指的是已经被追踪过,但是没有加入到暂存区(已经执行过git add/commit的但是这次修改后还没有git add) 举例: readme.md 已经被git add/git commit过,但是呢 我这次只是修改了,而且没有修改完,不能commit test 新建的文件夹,没有被git add/git commit过 有个急事需要处理,这时候我需要切换分支,去处理紧急任务,比如文中的举例去修改bug, 正确的步骤: git add test(让git去追踪这个新文件) git stash保留现场 如果我不执行这两个命令,那么我在修改BUG完成之后 git status,就会发现readme.md 没有添加到暂存区,同时又多了个test文件,但是自己的readme.md没有完成,万万不可以提交,这样导致bug的修改代码也提交不了。所以你需要 git stash,这样你在提交修改bug代码的时候 ,就不会看见readme.md 和 test。可以安心提交修改bug的代码。
     
    当处于不同分支下,工作区间中看到的文件对应分支的,git下ls也只看到对应分支的.
    merge分支,需要先切换到主分支下.
     
    查看历史提交:git log --pretty=oneline --abbrev-commit
    查看执行的历史命令:git reflog
     
     
    将某个分支(默认clone下来的是master主分支)拉下来:
    git clone xxx.git
    git remote add 远程仓库名  xxx.git(远程仓库链接)
    git remote -v
    git fetch --all
    git checkout -b 自定义本地分支名  远端主分支名/要拉的分支名
    git log:查看最新的commit
    这样拉拉下来的代码才是该分支的代码。
     
    要合代码必须在项目中添加一个成员才具有权限merge:public FuXiCodeServ -> Master -> add Project
     
    本地搭建git服务器:
     
     
    git pull与git pull --rebase的区别:
     
    fork出一个分支,只是原库的一个copy,当原分支更新时,fork出的分支并不会自动更新.
    若想将原分支的更新同步到fork分支:
     
    查看某个git命令的参数:git 子命令 -h
    查看git所有的命令:git help -a /  git help
     
    git branch --set-upstream 本地关联远程分支:https://blog.csdn.net/z1137730824/article/details/78254564
    git init:直接在当前目录创建.git目录
    git init 目录名:新建目录并在该目录下创建.git目录
    git pull = git fetch + git merge
    git pull origin master即git fetch origin + git merge origin/master
     

    Git-查看远程分支、本地分支、创建分支

    1.查看本地分支

    $ git branch
    * br-2.1.2.2
      master

    2.查看远程分支

    $ git branch -r
      origin/HEAD -> origin/master
      origin/feature/IOS_visualtrack
      origin/feature/android_visualtrack
      origin/master

    3.查看所有分支

    $ git branch -a
    * br-2.1.2.2
      master
      remotes/origin/HEAD -> origin/master
      remotes/origin/br-2.1.2.1
      remotes/origin/br-2.1.2.2
      remotes/origin/br-2.1.3
      remotes/origin/master

    4.切换远程分支

    $ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/Release
      remotes/origin/master
    
    $ git checkout -b myRelease origin/Release
    Branch myRelease set up to track remote branch Release from origin.
    Switched to a new branch 'myRelease'

    PS:作用是checkout远程的Release分支,在本地起名为myRelease分支,并切换到本地的myRelase分支

    5.合并分支

    合并前要先切回要并入的分支

    以下表示要把issue1234分支合并入master分支

    $: git checkout master
    $: git merge issue1234
    Merge made by recursive.
     README |    1 +
     1 files changed, 1 insertions(+), 0 deletions(-)

    6.撤消上一次commit的内容(该操作会彻底回退到某个版本,本地的源码也会变为上一个版本的内容)

    git reset --hard <commit-id>

    以下表示要撤消“update build gradle configuration file”这一次的commit id,返回到"add battery settings ui"这一次的commit id,

    xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((c8303a9...))
    $ git log
    commit c8303a9e8db2bcf4edb7488e722a380f4e8858ec (HEAD)
    Author: xp.chen <xp.chen@yuneec.com>
    Date:   Sat Oct 28 09:28:51 2017 +0800
    
        update build gradle configuration file
    
        Change-Id: I9ee532fd0d4698613698a64eb754fb98a8559e32
    
    commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a
    Author: xp.chen <xp.chen@yuneec.com>
    Date:   Sat Oct 28 09:02:01 2017 +0800
    
        add battery settigns ui
    
        Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e
    
    xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((c8303a9...))
    $ git reset --hard 8d8e5ccf24cf6836ab780aa3860270c3876e825a
    HEAD is now at 8d8e5cc add battery settigns ui
    
    xp.chen@YC-JG-YXKF-PC27 MINGW64 /f/ob ((8d8e5cc...))
    $ git log
    commit 8d8e5ccf24cf6836ab780aa3860270c3876e825a (HEAD)
    Author: xp.chen <xp.chen@yuneec.com>
    Date:   Sat Oct 28 09:02:01 2017 +0800
    
        add battery settigns ui
    
        Change-Id: Ia907ee4e84f54c00a186d31378a7925a6adaba0e
    

    7. git commit -m 注释换行

    git commit -m 注释可以通过单引号来换行,比如:

    $ git commit -m '
    > 1.aaaaa
    > 2.bbbb
    > '
    [master b25154b] 1.aaaaa 2.bbbb
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 ss.txt

    通过git commit --amend 命令可以查看到刚刚的log信息为

    1.aaaaa
    2.bbbb

    Beyond Compare代码比较工具使用

    合并代码前,先比较待合代码和远端代码的不同,确定哪些代码需要合。

    • 红色为有区别的文件(右键复制到右边,右箭头复制到右边)
    • 紫色为有不同的目录
    • 不等于号是需要修改的,约等于号主要是注释或格式不同,可不修改

    Git 合并代码流程

    1、先fork远端库(自己账户下会创建与远端库完全相同的个人库),然后将个人库clone到本地:执行git clone操作, 所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是本地的master分支自动“追踪”origin/master分支;因此,git clone执行后,git remote -v可以看到已经有分支输出。

        git clone ssh://xxx.git

    2、进到本地目录, git remote -v:查看远端库3、将要合并的远端主库添加到远端库列表:

    git remote add top ssh://xxx.git
    git remote -v:可以看到多了远端top(top表示远端主机名,而不是远端分支名; 默认有个master分支)

    4、将最新的远端库top的master分支代码拉到本地并与当前分支合并(git pull <远程主机名> <远程分支名>:<本地分支名>,这里省略本地分支名表示与当前分支合并):

    $ git pull top master
    remote: Counting objects: 173, done.
    remote: Compressing objects: 100% (149/149), done.
    remote: Total 173 (delta 90), reused 0 (deRecltaeiving objects: 45% (78/1 0)
    Receiving objects: 100% (173/173), 105.75 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (90/90), completed with 28 local objects.
    From ssh://xxx
    * branch           master     -> FETCH_HEAD
    * [new branch]     master     -> top/master
    Updating 2936c86..7a0181c
    error: Your local changes to the following files would be overwritten by merge: xxx.js
    Please commit your changes or stash them before you can merge.
    Aborting

    从远端拉代码到本地报错,因为本地的修改和远端新代码修改冲突了.

    5、将未提交的本地修改先暂存:

    git stash 

    6、再从远端拉代码:

    git pull top master

    7、恢复本地修改:

    $ git stash pop
    Auto-merging xxx.js
    On branch master
    Your branch is ahead of 'origin/master' by 14 commits.
    (use "git push" to publish your local commits)
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)
         ...
    Untracked files:
    (use "git add <file>..." to include in what will be committed)
           ...

    Auto merge表明远端代码和本地修改合并成功;若出现error,多半是他人合并的修改和自己的修改冲突了(即修改的同一文件),此时手动修改文件(删除>>>和<<<)可解决冲突.8、添加所有修改:

    git add .
    git status:可查看提交修改前后的状态

    9、提交修改:

    git commit -m "xxxx"

    10、将本地库推到个人远端库:

    git push origin master

    11、codeclub网站新建合并请求

    Merge Requests -> New Merge Request -> 选择个人远端库分支、主库分支 -> Compare branches and continue -> 选择合并人即可.进入个人远端分支库, 选择Merge Requests,分支名选master,合并的目的远端主库选add top对应的库.


    简化步骤:

    • 1、git clone fork后自己的远端库链接非主库并cd到该目录下
    • 2、若没有添加远端主库,则添加远端主库 git remote add top 远端主库链接git remote -v:查看远端主库
    • 3、将远端主库最新的代码拉到本地库git pull top(远端主库) master(远程分支名)
    • 4、手动对目录代码进行修改后,添加所有修改git add .git status
    • 5、提交修改git commit -m "修改描述"
    • 6、将本地库推到个人远端库git push origin(个人远端库名) master(本地分支库名)
    • 7、登录个人远端库,新建合并请求

    常见git命令:https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

    修改已提交的commit描述:https://www.jianshu.com/p/098d85a58bf1


    非本地Master仓库修改代码,合入远程主库

    解决办法1:

    • 1、若本地没有git仓库,先fork远端主库,然后在fork的个人远端库Settngs -> Members -> 搜索public FuXiCodeServ 角色选"Master",再点击Add to project.git clone xxx.git
    • 2、cd 到 本地clone的根目录
    • 3、git remote add top 远端主库链接
      • git remote -v
    • 4、将远端top主机的master主库最新的代码拉到本地:
      • git pull top master 或 git pull top master --rebase
    • 5、用Compare Beyond工具,比较代码编辑目录的文件(修改过的文件)和本地master库目录的文件,将修改过的部分添加到master库文件中,以解决冲突(master库中有,编辑目录中没的无需处理,只处理冲突).并将编辑目录中添加的文件拷贝到master库目录中.
    • 6、提交修改
      • git status
      • git add .
      • git commit -m "单号 描述"
      • git log
    • 7、推到远程个人仓
      • git pull top master --rebase:push前再拉一次检查是否有冲突;若还有冲突用IDE修改master的冲突文件(里面会有>>或<<标识冲突),然后git add .,最后用git rebase --continue合并冲突即可。
      • git push origin(个人远端库名) master(本地分支库名) (若报错慢于主库,则可以加--force)

    解决办法2:

    • 1、本地master拉远端库;
    • 2、创建与远端分支相同的本地分支:git checkout -b 本地分支名 远程仓库名/远程分支名;
    • 3、添加配置文件等与远端库不一样的运行所需文件;
    • 4、git stash:将配置部署所需文件的添加修改保存下来;
    • 5、git stash apply:将保存的修改重新应用到本地分支(git stash pop会删除最新一次的缓存;而git stash apply是复制一份最新的缓存而不会删除,这样下次还可以继续使用该缓存);
    • 6、git add .:将此次配置文件的添加修改add,这样下次git stash就不会将add过的修改保存下来。修改调试本地分支的代码;
    • 7、git stash:将本地分支的代码修改保存到最新一次的缓存中;(git stash貌似会将当前未add过的修改保存下来,当前工作空间将不再有该修改,若切换工作空间前不保存修改,则当前工作空间的的修改将丢失.若修改未提交即使add了,切换工作空间修改也会丢失,前面的add无效)
    • 8、git checkout master:切换回master分支
    • 9、git stash apply:将最新的缓存应用到本地master分支,即将代码修改应用到master;
    • 10、git add .
    • 11、git commit -m "描述":在本地master分支提交代码
    • 12、git pull top master --rebase
    • 13、git push 个人远端仓库名 本地分支名:远程分支名

    下次修改代码可以直接使用之前保存的配置文件的添加修改:

    • git pull 远端库名 远端分支名:本地分支名 / git pull 远端库名 本地分支名:将最新远端代码拉到本地分支
    • git stash apply 配置添加修改缓存名:在新代码上应用配置文件的添加修改
    • 修改调试本地分支的代码;
    • 之后与前面相同.
    解决办法3:

    将配置文件的添加修改独立成远端某条分支的提交,然后每次需要使用配置文件时,利用git cherry-pick拉该分支合入到当前分支.

    cherry-pick使用:https://blog.csdn.net/FightFightFight/article/details/81039050

    本地Master仓库修改代码, 合入远程主库

    • 1、检查分支情况
      • git branch -vv
      • git remote -vv
      • git status
    • 2、修改前
      • git pull top master --rebase
      • git log
      • git log --oneline
    • 3、在master上修改代码
    • 4、修改后
      • git status
      • git add .
      • git commit -m "描述"
      • git log
    • 5、推到远程个人仓
      • git pull top master --rebase
      • git checkout -b xxx(本地分支名,分支名最好根据问题单取名,远端个人仓分支名与这个相同)
      • git branch -vv
      • git remote add 个人远端仓库名 个人远端仓库地址
      • git push 个人远端仓库名 本地分支名:远程分支名 --表示将本地分支push到远端库的分支; 当本地分支名为空时,则表示删除远端分支.如果远端分支省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建.

    相关命令:

    • git branch -a:查看关联的远程分支
    • git branch:查看本地分支(*表示当前分支)
    • git checkout master:切换回master分支
    • git stash list:查看缓存列表
    • git stash apply stash@{2}:根据git stash list列举出的缓存名,应用更早的缓存(git stash同时具备堆栈和列表的特性)
    • git checkout -b serverfix origin/serverfix:在本地创建与远程分支完全相同的分支,并切到本地新建的分支.
    • git push <个人远端仓库名> <本地分支名>:<远程分支名>
    • git pull <远程主机名> <远程分支名>:<本地分支名> (注意区别git push)
    • git pull 或 git pulll --rebase:只有当前本地分支只有一个追踪分支时,远程主机名和远程分支名均可省略。对于git clone再执行git remote add的追踪分支数大于1,应当使用全部参数而不省略

    git pull 报错:'Cannot pull with rebase'原因:本地有未暂存的修改解决:https://blog.csdn.net/u012385190/article/details/70670213

     

    本地需求1已commit提MR但没合,现要搞另外一个新需求:

    本地新建分支并与远端分支相同:checkout -b 本地新分支 远端库/远端分支

     

    克隆仓库
    访问主库,先Fork
    Clone 主库
    git clone xxx.git
    查看仓库状态
    显示所有修改状态
    git status
    显示远程库状态
    git remote -vv
    显示分支状态
    git branch -vv
    此时主库的别名为origin
    添加fork仓库
    git remote add fork xxx.git
    此时自己仓库的别名为fork
    查看本地分支追踪的上游分支
    git branch -vv
    master代表本地分支,后面的[origin/master]代表本地分支追踪的是originmaster分支
    修改本地分支追踪的上游分支
    一般本地分支一定要追origin的某个分支(否则pull更新不到其他人的代码),可以通过如下命令修改分支的上游分支
    git branch -u origin/xxx
    此示例表示将本地分支最终origingaia-0831分支
    新建分支
    默认本地是使用的master分支,如果在本地新建分支,可以使用
    git checkout -b BRANCH_NAME
    此分支是基于git本地当前分支创建的,不一定是服务端最新的代码
    如果要创建一个和服务端相同的分支,可以使用
    git checkout -b BRANCH_NAME origin/BRANCH_NAME
    此时本地新建的分支BRANCH_NAME就是拉取服务端BRANCH_NAME的代码
    代码修改
    先更新本地代码到origin最新的分支
    git pull --rebase
    --rebase表示变基更新,如果本地有commit,此时会先将服务器的commit拉下来,然后基于服务端最新代码将本地commit
    重新合入,保证本地不会出现merge的提交(当然,可能有冲突,另外解决)
    修改代码,并commit
    git add xxxxx
    git commit
    再次更新origin的内容
    git pull --rebase
    解决完冲突之后,提交到fork仓库
    git push fork master:master
    示例为将本地master分支提交到forkmaster分支,分支名称可以任意
    追加修改的文件到上一次commit
    如果commit之后,还没有push到仓库前,发现还有文件要修改,且要与commit合并,此时可以
    先修改文件
    执行git add XXXX
    将修改文件追加到上一次commit
    git commit --amend
    在打开的窗口中修改提交信息,然后:wq保存即可
    另外如果commitpushfork库,但是没有合入origin库,可以按上述逻辑先将文件合入commit,然后强制pushfork(
    fork库上对应分支不能有自己其他提交,否则会覆盖丢失)
    git push fork master:master -f
    修改提交信息
    如果commit之后,发现信息有误,可以执行
    git commit --amend
    在打开的窗口中修改信息,然后:wq保存即可
    ####合并多个本地提交
    比如一个功能本地分为多次提交,最终push上库推荐合并为一个
    首先查看本地提交日志
    git log
    查看自己有多少个提交需要合并
    合并多个提交
    git rebase -i HEAD~2
    表示将本地前2个提交合并
    此时会弹出需要合并的提交信息,第一个pick保留,剩余的pick改为s

    pick a0c4b08f commit1
    pick 2b106445 commit2
    改为
    pick a0c4b08f commit1
    s 2b106445 commit2
    :wq保存,此时会另外弹出一个窗口用于编辑最终的提交信息,可以删除多余的内容(注意#是注释,实际不会提交上去)
    填写最终的commit信息,然后:wq即可
    查看是否合并
    git log
    本地暂存
    当本地有修改东西,在没有commit之前,并不能pull服务端的代码。如要pull代码,且不提交本地修改,可以使用gitstash
    功能
    将本地修改全部暂存起来
    git stash
    查看本地暂存列表
    git stash list
    恢复本地暂存列表第一个提交
    git stash pop
    清空本地暂存列表
    git stash clear
    解决冲突
    如在git pull --rebase时发生冲突,此时也有多种方法解决。
    先回滚pull,另外找个目录Clone主库代码,使用Beyond Compare合并自己的代码到新库,然后在新库中commit
    push
    git rebase --abort
    Intellij IDEA中,在项目根目录上邮件,点击Git,通过IDEA来合并冲突的文件

    ------------------------- 推开发环境:
    1、git add .
    2、git commit 回车按模板修改commit信息
    3、若再次修改了:git commit --amend
    4、跟踪远端top/master分支:git branch -u top/master
    5、把远端top/master最新代码拉下来:git pull --rebase
    6、若报ERROR COMPLICT代码冲突,打开IDEA -> 项目 -> 右键Git -> Resolve Complict解决冲突
    7、继续rebase:git rebase --continue
    8、push前再次拉远端代码以确保无冲突:git pull --rebase
    9、将本地master分支推到远端主库的个人分支top/xxx:git push top master:xxx -f
    git rebase失败,git rebase --abort取消rebase
     
    修改代码后,如果重新推到远端分支:
    git add .
    git commit --amend
    重新push到主库的个人分支:git push 远端库名 master:远端分支 -f
    注:若已提代码merge,则还要push到个人合代码的分支,这样合并代码会自动同步
    然后重新运行下上面的部署。
     
    回退提交/丢弃提交:
    git reflog
    git reset --hard [id] #id为需要丢弃的提交的前一个commit id/ 需要回退到的commit id
     
    git rebase -i HEAD~2 合并多个提交
     
    已经merge的代码,不要再commit --amend,否则会报本地代码和merge的代码冲突;新commit下
     
    git branch -u top/master报分支不存在解决办法:
    git remote add top xxxx
    git remote -v
    git fetch --all
    git branch -u top/master
     
    取消add:
    git status 先看一下add 中的文件 
    git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 
    git reset HEAD XXX/XXX/XXX.java 就是对某个文件进行撤销了
     

    本地需求1已commit提MR但没合,现要搞另外一个新需求:

    本地新建分支并与远端分支相同:checkout -b 本地新分支 远端库/远端分支

     

    本地分支A的commit a, merge 到远端分支top/master后;想将commit a也merge到top/good分支(good分支代码与master分支不同):

    1、本地新建与远端top/gaia相同的分支:git checkout -b newbranch top/good

    2、应用commit a到newbranch:git cherry-pick commit-a-ID

    3、再次更新远端代码到本地:git rebase -i top/good

    4、若无冲突,push到新的远端个人分支:push origin newbranch:newbranch -f

     

    git rebase -i远端分支时报错:

    $ git rebase -i top/xxx
    fatal: Needed a single revision
    invalid upstream top/xxx

    解决办法:

    git fetch --all:将远端所有分支拉到本地
    git rebase -i top/xxx

     
    git stash使用:
    作用:暂存当前修改而不提交,事后(拉取最新代码)恢复修改等。
    git stash list  查看所有stash
    git stash save "test-save-stash"   将当前未add的修改保存成stash,stash描述为"test-save-stash"
    git stash apply  stash@{0}  应用stash@{0}
    git stash pop stash@{0}   应用并删除stash@{0}
    git stash drop stash@{0}    这是删除第一个队列
    git stash clear  清空所有stash
     
    丢弃本地所有修改:https://www.jianshu.com/p/565306500575
     
    git reflog
    git reset --hard commitId(rebase前1个commitId)
     
     撤销已经add的修改:(然后再git checkout .即可丢弃本地所有修改)

    如果是撤销所有的已经add的文件:git reset HEAD .

    如果是撤销某个文件或文件夹:git reset HEAD filename

    删除中间某次提交:

    1.git log获取commit信息
    2.git rebase -i (commit-id)
    commit-id 为要删除的commit的下一个commit号(即只编译该commitId的前几个commit,决定去留)
    3.编辑文件,将要删除的commit之前的单词改为drop
    4.保存文件退出大功告成
    5.git log查看

    撤销 git commit --amend:https://www.jianshu.com/p/97341ed9d89e

    查看commit的内容:git show commit_id

    修改分支名称:https://www.jianshu.com/p/cc740394faf5

  • 相关阅读:
    GitHub(二)之修改项目语言类型
    GitHub(一)之图片上传问题
    Git入门操作(一)
    树莓派小白教程六部曲
    关于Ajax请求的JS封装函数
    JavaScript运动_封装模板(支持链式运动、完美运动)
    NAT-地址转换技术的配置
    JAVA连接Sql-Server教程
    Kibana对数据的可视化
    浏览器渲染机制
  • 原文地址:https://www.cnblogs.com/luckyboylch/p/12327328.html
Copyright © 2020-2023  润新知