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

 

"Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) "问题解决:

https://blog.csdn.net/zheng911209/article/details/47147483

 

修改历史commit非最后一次commit:

https://blog.csdn.net/tangkegagalikaiwu/article/details/8542827

 

查询代码行数:

git log --since=2020-01-01 --until=2020-12-30 --author="xxx" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

posted @ 2020-03-04 11:26  Coding练习生  阅读(461)  评论(0编辑  收藏  举报