Git基础

Git基础

个人Git工作原则一:** 永远是基于远程库的最新代码工作 **

尽量每一步操作(特别是add/commit/push)都通过git pull --rebase获取一下当前最新版本。

个人Git工作原则二:** 尽可能保证每一个Change的完整性以及独立性,且越小越好。**

工作目录(working directory)-(add)->缓存区(Staged Snapshot)-(commit)->提交历史(Commit History)

Git使用对应的分支名指针标示提交历史中分支的最新更新点,而HEAD定义了当前所在分支的最新更新点。并且可以通过在标示后加‘^’来实现引用指定更新点之前的一个更新点,当然也可以嵌套使用“^^”;如果需要引用n次前的更新点可以使用“~n”进行简化。

Git使用‘/’进行对应路径的引用,使用“<localbranchname>:<remotebranchname>”区分本地和远程分支

配置本地Git环境

  • git config --global user.name "自定义的姓名"
  • git config --global user.email "自定义的邮箱"

配置公钥

  • ssh-keygen -t rsa -C "之前声明的自定义邮箱"
  • 在本机C盘-->用户文件夹下-->.ssh文件夹下生成 id_rsa.pub(公钥)和id_rsa(私钥),将 id_rsa.pub 中的所有文件添加到Git网站的 SSH Keys 位置。

至此就可以通过clone等操作与远程Git库链接。

Git 常用操作

git init:在对应文件夹下创建Git库

git clone ……:从远程将库下载到本地

git status:当前本地库的状态

git add:将文件区中对应文件添加到缓存区 stage 

  • git add . 表示添加当前工作目录下的所有修改文件到缓存区

git commit:将缓存区文件添加到提交历史

  • git commit -m "修改说明"

git push:将本地库同步到远程

  • git push origin <localbranchname>:<remotebranchname> 将本地库分支同步到远程库的对应分支
  • git push origin <localbranchname> 如果存在对应远程分支则更新对应分支;如果没有则创建后更新
  • git push origin :<remotebranchname> 删除对应远程分支
  • git push origin <tagname>:可以推送一个本地标签
  • git push origin --tags:可以推送全部未推送过的本地标签
  • -f 如果本地分支落后于远程分支就需要使用此选项强行同步

git pull:将远程库同步到本地,与push操作相似

  • git pull origin master 将远程库的master分支同步到本地库的对应分支

git reset:提交层面(一个分支的末端指向另一个提交),文件层面(更改缓存区,而不更改文件目录)

  • --soft:只修改提交历史,相当于将指定回退版本到最新版本的所有提交退回到缓存区(未 commit 的状态)
  • --mixed:默认选项,修改提交历史和缓存区,相当于将指定回退版本到最新版本的所有提交退回到工作路径(未 add 的状态)
  • --hard:同步所有区域,包括工作目录,相当于将指定回退版本到最新版本的所有提交删除
  • git reset <branchname> <file>:可以指定对应分支标识点中包含的文件,并将其退回工作目录。此时由于缓存区一定改变,工作目录一定不变(如果将修改工作目录,必须先保存才能操作成功),因此上述无视到底指定了哪个选项。如果工作目录中就是刚刚通过add添加的文件,那么就相当于将add操作回退。

git checkout:提交层面(将HEAD指向对应分支,并更新工作目录),文件层面(不更改缓存区,但更改文件目录)

  • -b <branchname>:创建一个分支并自动将当前分支切换到新建分支 
  • -b [分支名] origin/[分支名]:创建分支并与远程对应分支关联,正常clone只同步master分支
  • git checkout <branchname> <filename>:将指定提交历史更新节点中的对应文件放入文件目录

git revert:创建一个新的提交来擦出指定提交历史更新节点到最新节点之间的所有修改。其与 get reset 对版本的回滚效果类似,但在与旧分支合并时,revert 能够保留回滚内容,但 reset 回滚内容可能再次出现。

git merge:分支融合操作

  • git merge <branchname>:将当前分支与指定分支合并
  • git merge --no-ff -m "commit说明" [合并分支名] 不使用Fast Forward在合并后保留分支信息

git rebase:将提交到某一分支上的某些修改移至另一分支上,本质上实现与git merge相同的功能,不过使提交历史串行。当需要将已修改的分支合并到另一个已修改的分支上时,通常使用rebase将已修改分支以指定分支为基,将所有结果整合到指定分支上,之后直接合并分支就能得到“一条线”的历史提交记录。不过应保证只对尚未推送或分享给别人的本地修改执行变基操作清理历史,绝不要对已推送至别处的提交执行变基操作。

  • git rebase <banchname>:以指定分支为基将当前分支的修改串行的添加到指定分支上,最后当前分支将在指定分支上添加当前分支的等效更新节点而保证当前分支与指定分支串行。
  • git rebase <startpoint> <endpoint> --onto <branchName>:将指定更新节点范围(startpoint 和 endpoint 指定,前开后闭)内的所有修改复制到指定分支上
  • git rebase -i <branchmarker>:修改指定提交历史之前的更新节点,之后根据选项需要进行操作。
pick:保留该commit(缩写:p)

reword:保留该commit,但我需要修改该commit的注释(缩写:r)

edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s)

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)
  • git rebase --continue:继续修改下一个之前指定的需要修改的更新节点
  • git rebase --abort:抛弃之前的修改内容

git log:提交历史操作

  • git log:查询当前提交历史
  • git reflog:查询已回退的提交历史编号
  • --graph:以线条图形化显示查询结果
  • --pretty=oneline :以一行显示查询结果
  • --abbrev-commit :只显示提交历史的主要信息

git branch:分支相应操作,此操作可以看到当前所有分支

  • git branch <branchname>:创建分支
  • git branch -d <branchname>:删除对应分支(需要退出须删除的分支)
  • git branch -D <branchname>:强行删除未合并的对应分支
  • git branch --set-upstream-to=origin/[分支名] [分支名] 将远程分支与本地已有分支关联

git stash:储存现场操作

  • git stash 保存现场并清空工作区
  • git stash list 查看当前分支中的现场
  • git stash apply [现场名] 调出某个现场但不删除现场列表
  • git stash drop [现场名] 删除现场列表中的某个现场
  • git stash pop [现场名] 调出现场并删除现场列表中的现场

git diff:比较文件的差别

  • git diff HEAD -- [须比较文件名] 比较当前分支与文件区中对应文件差别

git remote:远程仓库操作

  • git remote (-v) 查看远程库信息
  • git remote rename 原名字 新名字 给已关联的远程库改名
  • git remote add origin [仓库的SSH链接] 将远程仓库与本地仓库关联
  • git remote remove origin > /dev/null 2>&1 删除原有关联的remote代码仓

git tag:标签操作

  • git tag 查看当前分支标签
  • git tag (-a) [标签名称] ( -m “说明文本”) ([对应commit标号]) 给对应commit操作打标签
  • git show [标签名称] 查看标签信息
  • git tag -d <tagname>可以删除一个本地标签

.gitignore

指定库不管理的文件或路径,举例如下

*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild

Git 本地仓与远程仓关联

Git 全局设置

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

创建本地新的仓库

git clone ssh://git@git.************.git
cd ****
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

已存在本地文件

cd existing_folder
git init
git remote add origin ssh://git@*******************.git
git add .
git commit -m "Initial commit"
git push -u origin master

已存在本地仓库

cd existing_repo
git remote rename origin old-origin
git remote add origin ssh://git@****************.git
git push -u origin --all
git push -u origin --tags

合并远程和本地不相关的仓

git pull origin master --allow-unrelated-histories

 Git 疑难问题

  1.  访问中使用默认地址,无法正常访问:git config --global url.[new_url].insteadof [old_url] 

Git 添加本地文件夹为子仓

基本流程

  1. 在本地文件夹下创建 git 仓库:git init
  2. (可选)添加本地文件夹下的修改:git add,git commit
  3. 进入父仓库,添加新仓库为子仓:git submodule add /child_rep/path
  4. 此时会修改父仓库路径下的 .gitmodules 文件,并可以通过 git submodule 查看当前子仓库信息

子仓更新:

  1.  完成子仓的更新
  2. git submodule init
  3. git submodule update

Gerrit介绍

可以先参考:代码检视工具Gerrit的日常使用 - 简书

Gerrit相对Git提供了一个特有的命名空间“refs/for/”用来定义我们的提交上传到哪个branch,且可以用来区分我们的commit是提交到Gerrit进行审核还是直接提交到Git仓库

  • git push origin HEAD:refs/for/<branchname> 推送本地仓库但需要管理员检视并融合
  • git push origin :refs/tags/<tagname>可以删除一个远程标签
  • git push origin HEAD:refs/drafts/<branchname> 将非正式的提交推送到远程仓库的草稿箱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值