墙裂推荐
看完下面的介绍后,强烈推荐跟着此教程操作一遍:
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