GIT使用教程

墙裂推荐

看完下面的介绍后,强烈推荐跟着此教程操作一遍:
https://www.shiyanlou.com/courses/4

GIT名词解译

1. 工作目录

即平时使用ls命令时看到的文件与目录

2. 暂存区

使用git add filename,可以把有修改的文件添加到暂存区

3. 本地库

使用git commit可以把文件从暂存区提交到本地库中,只有添加到库中的修改,才有历史记录,可以追溯与还原

4. 远程库

使用git push可以把文件从本地库推送到远程库中,

GIT常规操作

克隆clone库:

# 克隆:使用http库地址
git clone http://www.xxxx.com/test-temp/testProject.git

# 克隆:使用git库地址
git clone git@gitlab.XXX.com/test/helloworld-web.git

# 克隆:使用git库地址,带端口.【ssh://】可要可不要
git clone ssh://git@gitlab.XXX.com:6022/test/helloworld-web.git

常用操作:

# 添加文件到暂存区:.表示所有文件,也可以指定文件
git add .       

# 将暂存区内容提交到本地库中
git commit -m "修改说明"        

# git add操作与git commit一步完成,但只会提交原来已经跟踪的文件,不会提交新增的文件
git commit -a -m "修改说明"  

# 从默认分支拉取最新代码  
git pull  

# 推送到默认的远程库,会推送到远程相应的分支下
git push   

# 推送到指定的分支
git push oschina qa  

# 签出或切换分支(注意是同一命令)
git checkout branchname

# 签出并新建分支
git checkout -b new_branchname

# 删除分支(不能删除当前分支)
git branch -D branchname

# 查看本地状态:
# 1.可查看已修改但未提交到暂存区的文件
# 2.可查看已提交到暂存区但未提交到本地库的文件
# 3.可查看已提交到本地库但未push到远程库的commit次数
# 4.可查看已合并但存在冲突,且冲突尚未解决的文件
# 5.可查看新添加,未跟踪的文件
git status

dengqingyong@bogon:helloworld-web$ git status
On branch sit
Your branch is ahead of 'origin/sit' by 1 commit. # 【一次commit未push到远程】
  (use "git push" to publish your local commits)
Changes to be committed:    # 【已暂存但未commit】
  (use "git reset HEAD <file>..." to unstage)

    new file:   test2.txt

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)

    modified:   README.md

Untracked files:    # 【新添加未跟踪】
  (use "git add <file>..." to include in what will be committed)

    test.txt

创建一个新项目

# 新建远程空仓库,然后将远程库克隆到本地
git clone ssh://git@gitlab.XXX.com/test/testproject.git

# 进入项目根目录
cd testproject

# 添加项目说明文件
touch README.md

# 将此说明文件添加到暂存区
git add README.md

# 将暂存区内容提交到本地库
git commit -m "add README"

# 将本地库push到远程,并建立分支跟踪
# 此时远程库完成了初始化,也可以先将远程库初始化再克隆到本地,但要做个合并
git push -u origin master

将已存在的项目提交到git仓库

# 进入项目根目录
cd existing_folder
# 将项目初始化git项目
git init
# 新建远程仓库,然后将远程仓库添加到本地git项目中
git remote add origin ssh://git@gitlab.XXX.com/test/testproject.git
# 将所有文件添加到暂存区
git add .
# 将暂存区内容提交到本地库
git commit -m "Initial commit"

# 如果git仓库是空仓库可以跳过这一步
# 如果git仓库原来已经有了内容,则必须先将远程内容合并到本地,才能push  
git pull origin branchname  
# 运行上面命令进行合并时很有可能会报下面的错误  
fatal: refusing to merge unrelated histories  
# 如果报错,使用下面的命令进行合并即可  
git pull origin branchname —allow-unrelated-histories

# 将本地库push到远程:此时会在远程自动创建master分支并建立追踪
git push -u origin master

在本地库中添加多个远程库

# 进入项目根目录
cd existing_repo

# 新建远程仓库,然后将远程仓库添加到本地git中
git remote add origin2 ssh://git@gitlab.XXX.com/test/testproject.git

# 将本地所有分支推送到远程
# 注意,此时并没有建立跟踪,以后直接使用git push时,会将内容push到默认的远程库中,想要push到origin2时,必须指定远程库名称,如下
git push origin2 --all

# 将本地所有tag推送到远程
git push origin2 --tags

fork项目从源库拉更新

# 前提说明:
# 源库【source】:源项目testProject.git,小明只读
# 个人库【origin】:小明fork了此项目/xiaoming/testProject.git ,小明有所有权限
# 小明将fork的项目克隆到本机,在此工作,并将工作成果push到个人库
# 小明在本机工作一段时间后,发现源库有重要更新,并且想取得此更新到个人库中

# 1. 在本地添加上游源库的映射: 
git remote add source git@www.xxxx.com:gigold-test-temp/testProject.git

# 2. 指定从上游源库特定分支拉取更新到本地: 
git fetch source qa

# 3. 切换到本地qa分支
git checkout qa

# 4. 将source/qa分支合并到本地qa分支,如果有冲突解决冲突
git merge source/qa

# 5. 将合并后的代码更新推送到fork出来的个人项目中: 
git push (等价于 git push origin qa)

注意:步骤1中的source中上游源库的别名,可以任意起名。

分支相关操作:

# 查看本地分支,当前分支名称前面会显示*图标
git branch
dengqingyong@bogon:helloworld-web$ git branch
  dev
  master
* sit

# 查看远程分支
git branch -r

# 查看所有分支,包含本地与远程,远程分支以【remotes】开头
git branch -a

# 切换分支或签出分支
git checkout branchname

# 从当前分支创建新分支并立即切换
git checkout -b newbranch

# 删除分支,不能删除当前分支,需要先切换到其余分支上再删除
git branch -D branchname

# 分支重命名
git branch -m oldname newname

查看日志

# 本地共有4分支,当前分支为sit分支
dengqingyong@bogon:helloworld-web$  git branch
  dev
  master
  qa
* sit

# 查看sit分支最近3次的提交记录
git log -3

# 查看sit分支最近1次的提交记录:显示文件修改详情
# 带上-p参数,可显示文件修改详情
# 带上文件名,可查看指定文件的修改详情
dengqingyong@bogon:helloworld-web$ git log -p -1
commit 34590527a484eb2e872210ee13d782d3b66c0417
Author: 邓清涌 <dqy@emjwash.com>
Date:   Tue Aug 1 10:26:34 2017 +0800

    修改说明:从022升级到023

diff --git a/index.html b/index.html
index 9c2d1c0..c700b51 100644
--- a/index.html
+++ b/index.html
@@ -4,6 +4,6 @@
        </head>
        <body>
        helloworld-web
-       no:022  -- it_dqy
+       no:023  -- it_dqy
        </body>
 </html>

# 查看dev比sit分支多出的commit:dev有sit没有的
# 下面有条命令都可以达到同样效果
git log sit..dev
git log dev ^sit
dengqingyong@bogon:helloworld-web$ git log sit..dev
commit d2d35ef435011fb79e7045b59acb9d64b3ba7067
Author: 邓清涌 <dqy@emjwash.com>
Date:   Mon Jul 31 17:35:50 2017 +0800

    dev:014

commit 3c09d40a5bbee1944ce8ac8ff0dc9c2d4077a899
Author: 邓清涌 <dqy@emjwash.com>
Date:   Mon Jul 31 17:26:19 2017 +0800

    dev:013

# 查看sit与dev分支有什么不同
# 包含sit有dev没有的 和 dev有的sit分支没有的 
# left 左箭头 < 表示此次commit位于sit分支
# right 右箭头 > 表示此次commit位于dev分支
git log --left-right sit...dev   
dengqingyong@bogon:helloworld-web$ git log --left-right sit...dev
commit < 34590527a484eb2e872210ee13d782d3b66c0417
Author: 邓清涌 <dqy@emjwash.com>
Date:   Tue Aug 1 10:26:34 2017 +0800

    xxx

commit > d2d35ef435011fb79e7045b59acb9d64b3ba7067
Author: 邓清涌 <dqy@emjwash.com>
Date:   Mon Jul 31 17:35:50 2017 +0800

    dev:014

commit > 3c09d40a5bbee1944ce8ac8ff0dc9c2d4077a899
Author: 邓清涌 <dqy@emjwash.com>
Date:   Mon Jul 31 17:26:19 2017 +0800

    dev:013

commit < a157db6dda14a22bcb751e1e09e2804417632763
Author: 邓清涌 <dqy@emjwash.com>
Date:   Mon Jul 31 17:19:54 2017 +0800

    xxx022

# 查看已commit但未push的提交描述:
git cherry -v  或 
git log -p master ^origin/master 

合并分支并解决冲突

合并本地分支

# 演示:将本地dev分支合并到sit分支
# 1.切换到sit分支
git checkout sit
# 2.合并,运行下面命令时,如果有冲突会提示合并失败,需要手动解决冲突
git merge dev
dengqingyong@bogon:helloworld-web$ git merge dev   【合并】
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
dengqingyong@bogon:helloworld-web$ git status  【查看冲突】
On branch sit
Your branch is ahead of 'origin/sit' by 1 commit.
  (use "git push" to publish your local commits)
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")

# 3.解决冲突
git mergetool 
# 4.解决冲突后提交,至此合并完成
git commit -m "解决冲突"

拉取远程代码与本地合并

# 前言:多人在dev分支上合作开发,个人开发完成后,将本地的代码提交到线上库的dev分支中
# 直接提交
git add .
git commit -m "小明负责模块"
git push    
# 此时,第一个提交的人会成功,后续提交的人很有可能会冲突
# 因为大家签出时都是同一个共同祖先(commitId),第一个人提交后,线上分支往前推进了,其余人再提交时,如果有修改同一文件的同一处代码,则git自动合并时不知道怎么处理会产生冲突,让开发自己手工合并
# 冲突时:提示push被拒绝,因为远程包含的work在你本地没有,通常是另一个库推送了相同的ref,你push前应该先集成远程的更新内容
dengqingyong@bogon:helloworld-web$ git push
To ssh://git@gitlab.XXX.com/test/helloworld-web.git
 ! [rejected]        sit -> sit (fetch first)
error: failed to push some refs to 'ssh://git@gitlab.XXX.com/test/helloworld-web.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
# 开始解决冲突(把远程更新整合进本地分支即是解决冲突)
# 拉取远程更新到本地
git fetch origin sit
# 合并:使用origin/sit访问远程分支
git merge origin/sit
# 解决冲突:手工处理,有冲突的地方决定是采用线上的还是自己的代码,或者综合,并删除冲突标记
git mergetool
# 注意:运行mergetool时,打开的图形处理工具中会有四个文件窗口,上部3个并排,底部一个
# 一个是本地分支(local)代码,以只读形式展示
# 一个是远程分支(remote)代码,以只读形式展示
# 一个是二者共同的某一祖先(base)代码,以只读形式展示:git合并时必须要本地、远程、二者某一时期共同祖先一起对比,才能合并
# 底部能够编辑的那一份是让我们手动编辑合并的,处理完成后保存退出
# commit, 不用add,因为解决完冲突后会自动提交至暂存区
git commit -m "处理"
# 此时就可以成功推送到远程了,唯一例外就是在你合并过程中,另一人又push了代码
git push 

注意:上面的git fetch origin sit与git merge origin/sit可以使用git pull origin sit一步来替代,但不建议这样做

gitlab域名变更后更新本地库地址

# 步骤一:进入到git库的根目录
cd cloud-ec

# 步骤二:查看git库远程服务器操作“句柄”(估且叫句柄,一个远程库对应一个句柄,名字都不一样)
deng@Deng-Mac:cloud-ec$ git remote
origin

# 步骤三:查看指定句柄原来的完整地址
deng@Deng-Mac:cloud-ec$ git remote get-url origin
ssh://git@gitlab.aaa.com/ec/cloud-ec.git

# 步骤四:为指定句柄配置一个新地址
deng@Deng-Mac:cloud-ec$ git remote set-url origin ssh://git@gitlab.bbb.com/ec/cloud-ec.git

# 步骤五:查看指定句柄的地址是否已经更新,与步骤三对比
deng@Deng-Mac:cloud-ec$ git remote get-url origin
ssh://git@gitlab.bbb.com/ec/cloud-ec.git

参考资料

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值