GIT 的常规操作
GIT 的常规操作
常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中
git 配置文件
git的配置文件位置
针对所有用户:/etc/gitconfig
针对当前用户: ~/.gitconfig查看配置的方法
git config --list
修改配置的方法
git config --global user.name "wangyubin" (修改的是~/.gitconfig)
git config --system user.name "wangyubin" (修改的是/etc/gitconfig)
git 基本使用
clone现有仓库
git clone URL (URL支持git,ssh,http,https等各种协议)
git中文件的各个状态
- unstaged - git仓库中没有此文件的相关记录
- modified - git仓库中有这个文件的记录,并且此文件当前有改动
- staged - 追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库
- commited - 追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)
查看git仓库中各文件状态
git status
初始化一个仓库
git init
在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态
追加文件
git add test.c
test.c的文件变为staged状态,其他文件还是unstaged状态
5.1 追加文件的结果1 - 恢复为原先状态(变为unstaged)
git rm --cache test.c
5.2 追加文件的结果2 - 提交到git仓库(变为commited)
git commit -m "my message"
修改文件
echo "aaa" >> test.c
test.c的状态变为modified
6.1 修改文件的结果1
git add test.c (暂时保存修改的内容,即变为staged)
下面有2条路可以选择:
6.1.1 取消刚才的暂时保存git reset test.c (状态变回modified)
6.2.2 将暂存的修改提交到git仓库
git commit -m "my message"
6.2 修改文件的结果2
git checkout test.c (将test.c恢复为git仓库中的最新版本,即变为commited状态,test.c的内容和5.2节一样)
删除文件
7.1 从git仓库和磁盘上删除文件git rm test.c (当前目录中删除了test.c,在git仓库中暂时删除了test.c,相当于staged状态)
7.1.1 从git仓库中删除test.c
git commit -m "my message" (git仓库以后不再维护test.c)
7.1.2 删错了,恢复刚才的操作
git reset HEAD test.c (恢复到删除前的状态,当前目录中已删除的test.c也恢复了,test.c仍文commited状态)
7.2 仅从git仓库中删除文件
git rm --cache test.c (当前目录中没有删除了test.c,仅在git仓库中暂时删除了test.c,相当于staged状态)
7.2.1 从git仓库中删除test.c
git commit -m "my message" (git仓库以后不再维护test.c,但是当前目录中仍然有test.c)
7.2.2 删错了,恢复刚才的操作
git reset HEAD test.c (和7.1.2一样)
7.3 误删除后的恢复
如果删除了一个文件,并且commit之后发现删错了。也可以恢复,git log (查看各次的提交信息)
git checkout commit号 (恢复到未删除前的commint号,此时删除的文件也恢复到磁盘上了)
git checkout master (备份好删除的文件后,再回到最新状态)
git 远程仓库
查看远程仓库
1.1 简单查看-所有仓库git remote (只能查看远程仓库的名字)
1.2 查看更多内容-所有仓库
git remote -v (远程仓库的名字及git地址)
1.3 查看单个仓库的信息
git remote show [remote-name]
新建远程仓库
git remote add [shortname] [url]
ex. git remote add mc git://www.host.com/gitdir/mycode.git修改远程仓库
git remote rename [oldnanme] [newname]
删除远程仓库
git remote rm [remote-name]
远程仓库的数据
5.1 获取数据git fetch [remote-name] (获取仓库的所有更新,但是不自动合并当前分支)
git pull (获取仓库的所有更新, 并且自动合并到当前分支)5.2 上传数据
git push [remote-name] [branch-name]
ex. git push origin master
git 标签
列出标签
1.1 查看所有taggit tag
1.2 查看某个tag
git show [tag-name]
新建标签
2.1 轻量级taggit tag [tag-name]
2.2 带标注的tag
git tag -a [tag-name] -m "tag message"
2.3 后期追加tag
git log --pretty=oneline (查看所有的commit号)
git tag -a [tag-name] [commit号前几位即可]删除标签
git tag -d [tag-name]
提交标签到远程仓库
git push [remote-name] --tags
ex. git push origin --tags
git 分支
查看和切换分支
git branch (查看所有的分支及当前处于哪个分支)
git branch -v (查看所有的分支的详细信息)
git branch --merged (查看已经合并的分支)
git branch --no-merged (查看还没合并的分支)
git checkout [branch-name] (切换到某个分支)新建分支
git branch [branch-name] (新建一个分支)
git branch -b [branch-name] (新建一个分支并切换到这个分支上)合并分支
git merge [branch-name]
ex. 将分支btest合并到主分支master
git checkout master
git merge btestmerge时有冲突的文件会列出来,需要手动合并
将冲突手动解决后,再次用 git status来查看是否还有 unmerged的文件。
如果没有冲突的文件,就可以 git commit 来提交这次合并了。删除分支
git branch -d [branch-name]
或者 git branch -D [branch-name] (强制删除某个还未合并的分支)远程分支相关
5.1 新建远程分支- git checkout [local_branch] (首先进入想要上传的分支)
git remote add [remote_repo] [remote_branch]
(这里的[remote_branch]是远程分支的名字,一般和[local_branch]同名,
[remote_repo]是远程仓库的名字)2 向远程分支推送数据
git push [remote_repo] [remote_branch]
3 删除远程分支
git push [remote_repo] :[remote_branch] (注意远程分支前有个":")
合并分支的另一个方法:衍和
衍和可以简化master上的提交记录,使得代码可以方便的回退,
但是在公共仓库上用衍和有一定的风险。
衍和我基本用不上,这里就不赘述了。
服务器创建 git 仓库, 并将其作为远程仓库
其实 git 是分布式的 SCM. 并不存在谁是服务器, 谁是客户端的问题, 这里所说的服务器上的git仓库, 指的是多人合作开发时, 共用的, 作为最终发布版本的 git 仓库.
这个 git 仓库就相当于你在 github 上建的仓库, 会将你在各个电脑上做的代码等提交到上面进行统一管理.
服务端 (远程 git 仓库)
生成用于git服务的账户 (一般就用git)
groupadd gpxxx
useradd -m -g gpxxx gitxxx初始化服务端的git 仓库
cd ~/
mkdir git-repo
cd git-repo
mkdir test.git
cd test.git
git --bare init
客户端 (本地 git 仓库)
新建本地git 仓库
cd ~/gitlocal
mkdir test
cd test
git init初始化本地仓库
touch README
git add README
git commit -m 'first commit for init'设置git用户信息
git config --global user.name "wangyubin"
git config --global user.email "xxx@xxx.com"关联远程仓库
git remote add origin gituser@<server address>:~/test.git/
将本地仓库提交到远程
git push origin master
git 使用中遇到的一些问题
git pull 时, 远程文件与本地文件有冲突
如果远程的仓库被其他人更新了, 并且更新的内容与我自己本地编辑的内容有冲突. 这时执行 git pull 可能有如下message:
Auto-merging path/to/conflict-file
CONFLICT (content): Merge conflict in path/to/conflict-file
Automatic merge failed; fix conflicts and then commit the result.
用文本编辑器 vim 或者 emacs 之类的来编辑冲突的文件 path/to/conflict-file, 冲突的地方有类似如下的显示
<<<<<<< HEAD
App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))
file = request.FILES.get('file-xxx')
App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))
=======
file = request.FILES.get('xxxx')
>>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5
=====
之上的 <<<<<<< HEAD 是本地的内容=====
之下的 >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5 是远程的内容(这个commit号每次都会不同)
根据实际情况, 删除多余的内容(包括===== >>>>> <<<<<< 之类的), 修改冲突的地方, 如果以本地的代码为准的话, 会得到如下结果:
App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))
file = request.FILES.get('file-xxx')
App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))
然后 git commit -am '提交的信息' 就解决了冲突.
最后, 也可以将本地的修改同步到远程 git 仓库: git push
git pull 时, 本地还有未commit 的文件
从远程仓库更新时, 假使本地还有没commit的文件A, 远程仓库的A文件却被修改了. 此时进行 git pull 时有如下信息:
6a707cc..f93575d master -> origin/master
Updating 6a707cc..f93575d
error: Your local changes to the following files would be overwritten by merge:
apps/myapp/utils.py
Please, commit your changes or stash them before you can merge.
Aborting
此时, 如果不想将本地文件commit(可能只是临时的修改), 但是又像将远程的仓库更新下来, 可以这样:
$ git stash # 先将自己的改变保存起来
Saved working directory and index state WIP on master: 6a707cc ...
HEAD is now at 6a707cc ...
$ git pull # 从远程仓库更新
Updating 6a707cc..f93575d
... ...
$ git stash pop # 将自己的修改合并到更新后的代码中
最后一步如果有冲突, 再参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.
git 分支合并时的冲突
正在开发的分支和主分支的编辑了同一个文件时, 在主分支上进行 merge 的时候可能会产生冲突.
以下构造一个冲突的示例:
$ git branch test # 创建一个分支 test, 但是没有进入test分支, 此时还在 master 分支上.
$ vim xxxx # 编辑 master 分支上的一个已有的文件
$ git commit -am 'xxx message' # 提交 master 分支的修改
$ git checkout test # 切换到 test 分支
$ vim xxxx # 编辑之前在 master 上编辑的文件, 可以编辑同一个地方, 造成冲突
$ git commit -am 'xxx message' # 提交 test 分支的修改
$ git checkout master # 切换到 master 分支
$ git merge test # 将 test 分支合并到 master 分支, 由于上面编辑了同一文件, 这里会产生冲突
Auto-merging xxxx
CONFLICT (content): Merge conflict in xxxx
Automatic merge failed; fix conflicts and then commit the result.
最后, 参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.
通过 git 提取补丁
提取的补丁的方法有多种:
$ git format-patch -1 # 提取本次 commit 和上次 commit 之间的不同, 并生成patch文件
$ git format-patch -2 # 提取本次 commit 和 上上次 commit 之间的不同, 并生成patch文件
$ git format-patch commit号1 commit号2 # 提取2次commit号之间的不同, 并生成patch文件 (commit号可以通过 git log 来查看)
$ git format-patch tag1 tag2 # 提取2次tag之间的不同, 并生成patch文件 (tag可以通过 git tag 来查看)
通过 git 提取指定版本的源码
这个功能在部署的时候比较有用.
$ git archive --format=tar --prefix="tagxx/" tagxx > ../tagxx.tar # 获取 tagxx 的源码, 加了 --prefix 的作用是在最终的 tagxx.tar 中加了一层文件夹 tagxx
上面的 tagxx 也可以是 commit号
GIT 的常规操作的更多相关文章
- (转载)IDEA中对Git的常规操作(合并,提交,新建分支,更新)
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...
- Git常用的操作
1.git使用的常规操作 git pull——>编辑——>git add——>git commit——>git push 用git add把文件添加进去,实际上就是把文 ...
- Learn Docker(一)—软件安装与常规操作
一.安装Docker Windows平台 在Windows10 X64专业版上可以直接下载Docker原生应用进行安装,在控制面板的程序与功能里启用Hyper-v,之后就可以运行docker程序啦. ...
- git命令行操作
从本地上传代码到仓库(假设已经建好仓库): 1.初始化: git init 2.将所有文件加入缓存区: git add * 3.提交当前工作空间的修改内容: git commit -m 'commit ...
- Git基本命令行操作 (转)
Git远程操作详解 作者: 阮一峰 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和 ...
- windows下使用TortoiseGit代替Git命令行操作
windows下使用TortoiseGit代替Git命令行操作 大家在使用svn的时候,都非常喜欢使用小乌龟,也就是TortoiseSVN:那么git也有小乌龟版本,即TortoiseGit. 1.安 ...
- FTP服务器常规操作
导读 FTP协议是Internet文件传输的基础,它是由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据.下面就由我给大家简单介绍一下 ...
- Apache服务器常规操作
导读 Apache是世界上排名第一的Web服务器,50%以上的Web服务器都在使用Apache,它几乎可以在所有计算机平台上运行.下面就由我给大家说说Apache服务器的一些常规操作. Apache服 ...
- mysql服务器的常规操作
mysql服务器的常规操作 导读 MySQL是一个小型关系数据库管理系统,目前被广泛的应用在Internet上的中小型网站中,体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,使得许多中小型网站 ...
随机推荐
- web开发框架Flask学习二
jinja2模板规范 在当前项目中创建一个文件为templates的文件夹,将其设置为模板文件夹,新建的html为模板页面, 在视图函数中使用render_template(".html的文 ...
- 第5模块闯关CSS练习题
1.列举你知道的css选择器? 说道css选择器,大家都知道有许多种,但是真要你去掰着手指头数一数的话,你可能需要数几分钟.其实这么多选择器,完全可以分为两类: 标签选择器(*是特殊情况),可但标签, ...
- “帮你APP”团队冲刺3
1.整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’) : 所有工作的预期时间:88h 目前已经 ...
- NopCommerce 导航菜单HTML静态处理以提高性能
因网站要快速上线,有时候NopCommerce性能问题一直是困扰我们的最大因素,查找出来需要优化的部分代码进行修改重构是方法之一,我等非主流优化方式只为快速提高程序整体性能. 我以导航菜单为例,列出我 ...
- 有关js的一些小问题
忘了从哪里找来抄下来的: js执行顺序问题 1.函数的声明和调用 “定义式”函数声明 function fn1() {......} "赋值式"函数声明 var f=functio ...
- java多线程安全的问题
多线程中一定会遇到线程安全的问题,也就是在同一时间N条线程操作了同一变量,这个变量也叫做共享变量. 举例:(错误的示范) 设计一个投票系统,多个人可以对同一个的票数进行投票,下面看具体代码: 代码: ...
- luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree
k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...
- laravel5.2总结--本地化以及常量的使用
1.本地化 Laravel 的本地化功能提供方便的方法来获取多语言的字符串,让你的网站可以简单的支持多语言. 语言包存放在 resources/lang 文件夹的文件里.每一个子目录应该对应一种语言 ...
- ECMAScript5.1
http://lzw.me/pages/ecmascript/ ECMAScript5.1中文版 https://msdn.microsoft.com/zh-cn/library/dn656907. ...
- CSU-2049 象棋
CSU-2049 象棋 Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多 ...