IDEA + Git

Git


概要

  • 代码版本管理工具
    • Git :分布式版本控制系统
    • SVN:集中式的版本控制系统
  • 区别
    • Git的底层并没有采用 CVS、SVN 底层所采用的那套增量式文件系统,而是采用一套自行维护的存储文件系统。当文件变动发生提交时,该文件系统存储的不是文件的差异信息,而是文件快照,即整个文件内容,并保存指向快照的索引。
    • 提高 Git 分支的使用效率
    • 导致代码仓库中内容重复程度过高,从而仓库体积过大
  • 参考资料
    • Git的gc功能

基本操作

  • 项目检出:

    • Windows : 建立工作空间,d:/work/project,项目放在一起便于管理
    • 登录 gitLab / gitHub,点击相应项目,选择HTTP方式,复制项目HTTP地址
    • IDEA:
      • VCS --> check out from version control --> 粘贴http地址 --> 将主干 master clone 到本地
      • VCS --> git --> clone --> 粘贴http地址,选择本地存放目录
    • 检出的项目非Maven管理项目
      • 现象
        • IDEA 左侧 Project 中项目无法正常展示通过
        • 快捷键无法打开某个的接口的实现类
        • IDEA 右侧 Maven 点击展开无法查看到项目中每个Moudle
      • 解决
        • 选中 Project --> 右键 --> Maven --> add 将项目改为Maven管理的项目
  • 命令窗口:

    • 安装 Git ;打开本地项目目录,右键 Git Bash Here ,打开命令窗口
    • IDEA 下方 Terminal 窗口(实际为命令行窗口IDEA - Terminal)
    • Windows+R --> cmd --> 运行命令窗口 --> 切换目录到项目存放目录,可以直接执行 git 命令
  • 远程同步:更新远程服务器所有分支到本地

    • git fetch :用于同事新push分支后你无法获取的情况下
    • git fetch -p :清除远程已被删除的分支
      • git remote show origin 查看remote地址,远程分支,还有本地分支与之相对应关系等信息
      • git remote prune origin 清除远程已经删除的分支
      • git pull -p 清除远程已经删除的分支
  • 创建分支:

    • 开发分支命名规范:dev-author-date-project 开发人-创建日期-项目名称
    • git checkout master 切换到本地master分支
    • git fetch 拉取远程最新代码
    • git pull origin master 拉取远程master最新代码
    • git checkout -b dev-author-date-project origin/master 从远程master分支clone新的开发分支
    • git push -u origin dev-author-date-project 提交开发分支到远程
    • git branch --set-upstream-to=origin/dev-author-date-project dev-author-date-project 将本地分支与远程分支关联
      • 目的在于push代码时无法关注当前代码提交到了远程的哪个分支,否则通过IDEA提交代码时需要切换origin分支,不然就会直接提交到master
  • 代码拉取:

    • git pull -p origin dev-author-date-project
  • 切换分支:

    • git status 切换分支前确认当前分支无未 Commit and Push 的代码,否则会将当前未提交的代码带到下一个分支中,造成误提交
    • 移除提交
      • 移除未跟踪内容
        • 将待提交的内容从索引缓存区中移除

          Changes to be committed:
          (use “git reset HEAD …” to unstage)

          • git reset HEAD filePath/fileName
          • filePath/fileName 可通过 git status 查看得出
        • git rm 移除添加索引库中的指定文件

          • git rm -r --cached . 不删除本地文件
            • . 表示所有,可以替换为指定的文件
          • git rm -r --f . 删除本地文件
            • . 表示所有,可以替换为指定的文件
      • 忽略未跟踪内容
        • git clean -fn 查看可以忽略的内容
        • git clean -f 执行忽略文件操作
        • git clean -fd 忽略文件目录
      • 暂存未提交内容:误操作,不想在当前分支提交修改,git stash ,切换到下一给分支,git stash pop , git commit ,git push 就可以将在上一个分支误开发的内容提交到下一个分支上了
    • 切换操作
      • git checkout dev-author-date-project
      • IDEA 右下角,左键点击 Git:Master --> Remote Branches --> 选择相应的分支目录 --> check out as new local branch 选择一个远程分支建立本地分支
  • 代码提交:

    • a.git 命令
      • git status 查看当前未 commit 的代码
      • git add
        • git add . 提交所有未 commit 的代码
        • git add 通过status 的输出结果,通过包路径添加指定的文件,可以避免将一些不需提交的配置文件误提交
        • 将文件内容添加索引库中,索引库中保存工作数内容的快照,该快照作为下一次提交的内容
        • 如果执行 git add 命令后,再次修改该类,需要重新 git add 否则 commit 的不是最新的代码
      • git rm 移除添加索引库中的指定文件
      • git commit 命令将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中
        • git commit -m “” 将添加到 add 的代码提交到本地,添加注释
        • git commit -a 查看所有需要提交的代码信息
      • git push
        • git push -u origin master
          • 将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push
          • git push
            • 默认只推送当前分支,simple方式
        • git push –-force / -f origin master
          • 强制提交
    • b.git branch --set-upstream-to=origin/master master
      • 将本地分支与远程分支建立联系
    • c.IDEA
      • IDEA 中在一个已修改的文件中右键 Commit and Push ;查看此次修改的内容及自己修改的所有类,避免误提交 ;
      • 未提交代码前,该分支仅自己可见;提交代码后会发布到主干分支代码上,commit 提交代码,一定要操作push 将代码推送到服务中心
      • 提交代码时在修改的代码中进行右键点击提交 git --> commit file ,能够看到此次修改的内容及自己修改的所有类,避免误提交,依次点击 commit and push ,再次确认后 ,push
  • 状态查看:当前分支名称及未提交的代码内容

    • git status
  • 代码合并

    • 合并前需要记录版本号,合并后升级当前版本

    • a.IDEA 操作

      • 切换要合并的分支,git pull 最新代码
      • 切换被合并的分支,git pull 最新代码
      • 将分支切换到目的分支上,IDEA 右下角,选择需要被合并的分支A,点击merge ;A 合并至B
      • 代码提交
        • 通过IDEA 合并后的代码,直接右键 commit and push 无提交内容,需要手动修改一个无关的代码类,添加空格,在 commit and push 后,再 push 时提示有合并代码
        • git 命令行执行 git status 查询提交状态,git push 推送
        • IDEA 选中项目 --> 右键 --> git -->Repository --> push

      IDEA + Git_第1张图片

    • git 命令

      • 切换需要合并的分支,目的分支
      • git merge origin/dev-author-date-project
      • 提示冲突,IDEA 中右键 ,git --> resolve conficts --> 解决冲突 (左侧是目的分支,中间是合并后的分支,右侧是本地分支代码)–> 提交 apply
      • git status 查看需要提交的内容
      • git commit -m “” 提交合并后的代码
      • git push -u origin dev-author-date-project
      • git merge origin/dev-author-date-project 后可在 IDEA 中通过修改已有类,添加空格,再次 commit and push --> push 远程时查看本次提交的代码或直接通过IDEA提交或直接执行push命令
    • gitlab 提供图形化界面,使用提供的 merge request

  • 冲突解决:

    • IDEA
      • 选中冲突文件右键 git -> resolve conflict --> 点击左上角向下箭头逐个处理冲突文件 --> 将左侧或右侧的冲突文件合并至中间行 --> 点击 apply 提交
  • 查看分支:验证push后的分支是否已经提交到远程

    • git branch 查看本地分支
    • git branch -r 远程分支
    • git branch -a 远程分支与本地分支
  • 删除分支:

    • 删除本地分支:
      • git branch -d dev-author-date-project
      • git branch -D dev-author-date-project 强制删除
    • 删除远程分支:
      • git push origin --delete dev-author-date-project
  • 版本回退:

    • git reset --hard 版本号 (版本号在gitlab上查看)
    • git reset --hard HEAD^ 回退上一个版本
    • git reset --hard HEAD^^回退上上一个版本
  • 导出纯净源代码:

    • git archive --format zip --output “./output.zip” master -0
      • git archive -l 支持的格式: tar、tgz、tar.gz、zip
      • 0 store only
      • output 格式化后输出文件位置及文件名称
  • Git 命令行生成账号秘钥,ssh-keygen 生成秘钥,存储到本地C盘用户目录,rdsa.pub ,生成后,通过cat 命令查看生成公钥内容

    • Git SSH Key 生成步骤
  • Git 重新当前登录用户密码

    • git config --system --unset credential.helper
    • 使用场景
      • git push 提交代码时提示用户非法无效账号,原因在于密码过期
      • 执行 git config --system --unset credential.helper
      • 执行 git pull
      • 提示重新输入用户名
      • 提示重新输入用户密码
      • git push
  • 参考资料

    • 廖雪峰的Git教程
    • git的简单使用
    • Git教程

常见问题

  • 问题1:

    • 描述:IDEA 中未看到同事提交的远程分支
    • 解决:Git命令行运行 git fetch 拉取远程最新代码
  • 问题2:

    • 描述:项目配置文件进行修改,拉取最新代码时提示需提交修改的文件内容,但配置文件内容修改内容仅本地使用且无需修改;
    • 解决:
      • 一种方法是回滚 git revert ;
      • 一种是保存本地修改,拉取代码后,再恢复本地修改
        • 依次执行如下命令
          • git stash
          • git pull origin dev-author-date-project
          • git stash pop
  • 问题3:

    • 描述:拉取本地开发分支所属的远程分支的最新代码时提示远程分支不存在

    No tracked branch configured for branch dev-author-date-project or the branch doesn’t exist.
    To make your branch track a remote branch call, for example,
    git branch --set-upstream-to origin/dev-author-date-project dev-author-date-project (show balloon)

    • 原因
      • 当前选择的本地的工作空间的分支是 dev-author-date-project ,而此分支在远程已经被其他人删除,所以更新代码时会有上述的提示
    • 解决
      • 切换开发分支
      • IDEA 选择服务端存在的其他分支或需要使用的分支,check out as local branch ;选为当前工作的分支,再次执行代码更新操作
      • Git : git checkout dev-author-date-projectOther
  • 问题4:

    • 描述:提交代码,原本提交分支的代码提交到了master
    • 原因:当前分支是从master上clone出来的,使用IDEA 的推送代码时,首先在修改类中右键选择commit and push --> 确认代码修改后 点击commit --> commit and push 命令窗口,如果新建分支没有和远程分支绑定,下图红框处标识为 master ,如果没有手动修改此处为对应的远程开发分支,直接push,代码就会被提交到远程分支
    • IDEA推送代码
    • 解决:
      • 在push操作时手动修改 push origin dev-branch 即可
      • 根本原因在于创建分支后没有将本地分支与远程分支绑定关系,为避免出现类似情况
        • 创建分支时执行 git push -u origin dev-author-date-project
        • 创建分支后执行 git branch --set-upstream-to=origin/master master
  • 问题5:

    • 描述:检出项目后提示 IDEA The directory is registered as a Git root, but no Git repositories were found there
    • 原因:工作空间设置有误
    • 解决:Setting --> Version Control --> 删除当前的 project
    • 参考资料:
      • IDEA *.is registered as a Git root, but no Git repositories were found there.
  • 问题6:

    • 描述:IDEA 合并代码后,点击 Commit and Push 无变更记录
    • 解决:
      • 随便选中一个本期不提交的类,添加空格,将该类 Commit and push ,在 push 代码时会将合并后的代码展示出来,此时点击 push 即可
      • 工作空间 --> 右键:git --> Repository --> unstash changes --> 选中一个版本 --> apply stash --> 提示解决冲突、合并代码 --> 再选择下一个版本 -->apply stash
      • 选中Project --> 右键 --> git --> Repository --> push
      • 命令行执行git status ; git push
      • 合并后的代码处于已经提交状态,只是未推动当前分支的远程分支上
  • 问题7:

    • 描述:合并代码后发现部分代码未合并
    • 解决:
      • 合并前拉取最新的远程分支代码,git fetch -p
      • 通过IDEA 提供的代码合并工具,先选择目的分支的远程分支,不使用本地分支进行合并,然后选择要合并到此分支的远程分支
  • 问题8 :

    • 描述: Git Bash 中操作,在当前分支中更新其他分支的代码会提示代码合并问题,会将更新的分支代码合并到当前分支
    • 备注:先切换到指定分支后,再更新该分支的代码
  • 问题9 :

    • 描述:执行 git pull 命令提示 Your local changes to the following files would be overwritten by merge:
    • 解决:
      - git stash
      - git pull
      - git stash pop
    • 备注:
      • 只能锁住已放入缓存区中的变更内容,untracked 状态的文件无法锁定
  • 问题10 :

    • 描述:本地有配置文件的修改,不想提交到远程,但不提交不允许 git pull 最新代码
    • 解决:
      • git stash
      • git pull
      • git stash pop
    • 切换分支后,想把上个分支修改的配置文件信息带到这个分支上
      • git stash pop
    • 如果此时提示冲突,冲突解决后,原本是未放入 add 索引中的文件,现在是 待 commit 状态
      • git status 查询待commit的文件路径及名称
      • git reset HEAD xxxx 将文件从 add 中移除
        • xxxx 为 git status 中查看的文件路径及文件名称
  • 问题11:

    • 描述:代码回滚 – 回滚已经提交的内容
    • 解决:
      • git reset --hard commit-id ;
        • commit-id 回滚到指定的版本
      • git push -u -f origin master
        • 此时执行 git status 提示有未更新,再次执行 git pull 则回到为回滚之前的状态,不要执行 git pull 命令
        • git push -f 此时需要强制push本地代码到远程,覆盖远程分支的代码
    • 重新合并之前提交的代码
      • 比较笨的方法则是,回滚前做好分支备份,参照备份分支进行代码找回操作
      • git cherry-pick commit-id 将某个提交的版本号的代码合并到当前分支上;每次只能合并一个提交版本
      • git rebase 可以合并多个提交版本
        git合并分支上指定的commit
  • 问题12:push 推送代码提示无权访问

    [xx.dev@d_build_b xxx]$ git push 
    Counting objects: 136, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (74/74), done.
    Writing objects: 100% (136/136), 11.02 KiB | 5.51 MiB/s, done.
    Total 136 (delta 37), reused 113 (delta 17)
    remote: GitLab: You are not allowed to access dev-master!
    remote: error: hook declined to update refs/heads/dev-master
    To x.x.x.x:xx/x.git
     ! [remote rejected]     dev-master -> dev-master (hook declined)
    error: failed to push some refs to '[email protected]:xx/x.git'
    
    • 描述:开发环境,git 管理代码,切换 code 分支时 , git status 查看当前分支变化,提示有 x 个 commit 未推送,执行 git push 命令报错
    • 解决:
      • 切换分支:git checkout master 切换本地分支
      • 删除分支:git branch -d dev-master 删除原有本地分支
      • 新建分支:git branch -b dev-master origin/dev-master
      • 因为本地分支有提交问题,gitlab 上提交代码无问题,但是开发环境服务器上进行 git pull 时始终拉取不到最新代码,本地分支有修改未提交导致拉取失败;删除本地分支重新建立
  • 问题 13:

    • 描述:执行 git pull 时提示 error: The following untracked working tree files would be overwritten by merge:
    • 解决:
      • 确认本地分支绑定了远程分支 git branch --set-upstream-to=origin/xxx xxx
      • git status 查看提示说明
      • 问题的原因在于未跟踪到文件会产生覆盖,解决思路
        • 删掉未跟踪文件
        • 忽略未跟踪文件
        • 提交未跟踪文件
      • 删掉:通过 git status 执行查看文件是否是需要提交的文件,若否,则删掉
      • 忽略:git clean -f -n 查看忽略的文件 ; git clean -f 移除 ;git clean -fd 移除目录
      • 提交 git add * ,git commit -m “” ;git push
    • 参考资料
    • The following untracked working tree files would be overwritten by merge
  • 问题14 :

    • 描述:如何查询本地分支跟踪的远程分支
      • 本地分支名称与远程分支名称不一致时,不确认远程是谁
    • 解决:git branch -vv
  • 问题15:

    • 描述:恢复本地工作空间中删除的文件;git rm -rf filePash/fileName 删除不想提交的内容,多删除了一个文件
    • 解决:
      • git status 查看文件,文件标识删除
      • git resest HEAD filePath/fileName 从git status 查看的文件的路径上复制
      • git checkout filePath/fileName 从git status 查看的文件的路径上复制
    • 参考资料
      • git找回本地误删的文件
  • 问题16:

    • 描述:Git 误操作 merge 回退 merge 代码
      • 切换到A分支 git checkout A ,git pull B分支 会将B分支代码merge 到 A 分支上
    • 解决:
      • Git reflog 查看需要回退的提交编号
      • Git reset --hard commit-id
      • Git reflog 查看是否回退
    • 参考资料
      • Git回滚merge操作
  • 问题 17 :出现 merging 解决方案

    • 描述:领取远程分支代码时,出现 MERGING 的提示
    • 解决:git reset --hard head
    • 参考资料
      • Git出现|MERGING解决

更新文件 git pull -p 出现提示 create mode 100644

  • 数字含义

    • 1000 (regular file), 1010 (symbolic link) 1110 (gitlink)
    • 100 普通文件 101 符号链接 111 Git链接
  • 数字含义 644 : r(读) = 4 ,w(写) = 2, x(执行) = 1

  • git add时create mode 100644到底是什么含义?


命令模板

Git global setup -- 通用设置

git config --global user.name ""
git config --global user.email ""

1.Create a new repository 新建仓库

git clone http://xxxx.git
cd file
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

2.Existing folder 项目已存在

cd existing_folder
git init
git remote add origin http://xxxx.git
git add .
git commit -m "Initial commit"
git push -u origin master

3.Existing Git repository 仓库已存在

cd existing_repo
git remote add origin http://git.jd.com/zhangbiao24/tqmall-alligator.git
git push -u origin --all
git push -u origin --tags

4.将本地项目提交到远程操作流程
代码提交流程

git init 

git remote add origin http://xxx.git

git add .

git commit -m ""

git push -u origin master

git fetch

git push -f 


管理工具

  • SourceTree

参考资料

  • git - 管理项目(SourceTree的使用)

冲突解决

  • 冲突标记
<<<<<<< HEAD
自己提交的内容
=======
他人提交的内容
>>>>>>> 与之冲突的版本号
  • 参考资料
    • Git版本控制:Git冲突解决 相关错误总结
    • 多人开发时Git下冲突的产生和解决

git status 文件状态

文件状态 含义说明 相关操作
nothing to commit, working directory clean - -
Untracked files 文件为新增文件,纳入版本控制管理,但不在上次提交的快照中 git add 将其加入暂存区
Changes not staged for commit 已跟踪的文件发生了修改 git add 将其加入缓存区
Changes to be committed 等待提交 git commit -m “” git reset HEAD fielpath:filename 将加入暂存区的文件移除,回到其原来的状态
  • 参考资料
    • 2 Git 基础 - 记录每次更新到仓库

git log 与 git reflog

  • git log: commit 的版本日志 包含提交的版本 操作者 日期 (方便查看commit的版本,但是版本回退后,使用git log 看不到回退版本号之后的版本记录)
  • git reflog: 使用git 命令进行操作的日志 包括当前步骤所在哪个版本(一个commit 产生一个版本, 指定版本回退只能回退到该commit) 以及操作的具体内容

git log 与 git reflog 的 区别


git merge 与 git pull

  • git pull ⇒ git fetch + git merge 获取远程最新代码并合并最新代码到当前分支

  • 参考资料

    • 真正理解 git fetch, git pull 以及 FETCH_HEAD
      git log: commit 的版本日志 包含提交的版本 操作者 日期 (方便查看commit的版本,但是版本回退后,使用git log 看不到回退版本号之后的版本记录)

git rebase

  • 取消git rebase
    • 描述:使用IDEA合并代码时,误选择 rebase onto
    • 解决:git rebase --abort

You are currently rebasing branch ‘master’ on ‘axxxxxxxx’

  • 选择rebase onto 后执行 git status 命令提示,以及当前需要打补丁的次数

  • 解决冲突,git add .* ;git commit ; git rebase --continue

  • 重复上述步骤直至完成分支合并

  • 参考资料

    • 小猪的Git使用总结
    • git rebase后commit丢失

.gitignore

  • 使用git status 查看状态时总是会列出被跟踪的文件,可以通过 .gitignore文件来达到过滤的目的
  • 在创建.gitignore文件之前就已经push项目,那么即时你在.gitignore文件中写入新的规则,这些规则也不会起作用
  • .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的
  • 参考资料
    • git取消文件跟踪

远程分支未同步

  • Linux 服务器上切换系统部署分支时发现本来已经删除的远程分支却在部署服务器端再次看到

  • 描述:git branch -a 查看所有分支时发现早已经删除的远程分支

  • 解决:git fetch -p 更新时过滤已经删除的远程分支

  • 原因:Linux 服务端也可以看做是一个远程分支的本地客户端,当你在开发时,如果其他同事新增或删除远程分支,你也是不知道,直到你需要添加代码时才会感知,服务器端同样,也需要主动拉取最新分支,而不会自动同步

  • 误解:

    • 当时一直没有想清楚为什么会出现不同步的问题,考虑问题的方向逐渐向 git 配置文件靠拢
    • 系统项目存放目录有一个 .git 文件夹,查看文件夹内的 config 文件

    [remote “origin”]
    url = http://git.com
    fetch = +refs/heads/:refs/remotes/origin/

    • 一直以为是 git 区分读写分支,本地开发时读写,服务器端是只读,因为是只读的,所以不需同步,但服务器端也可以修改提交代码,互相矛盾
    • 突然有一天想到一个问题,git 是分布式管理,如果不主动向远程发起同步的请求就不会同步

文件状态

状态 Untracked Staged Modified Unmodified
含义 未跟踪 暂存区 修改文件 未修改文件

IDEA + Git_第2张图片

你可能感兴趣的:(Idea)