代码小工蚁-git与GitHub使用备忘

git for windows的使用

此文章暂停更新。最后更新日期:2017-12-09

一、准备工作:
1、申请GitHub账号
https://github.com/
邮箱、密码及用户名(记好)

2、软件下载、安装
https://git-for-windows.github.io/

下载git for windows
git安装完成菜单

git安装完成后,在开始菜单中会有Git项,里面有“Git Bash”、“Git CMD”、“Git GUI”等三项菜单。
Git Bash:Linux风格的命令行,使用最多,推荐最多。
启动Git Bash会出现$提示符,用户可以输入相关命令进行操作。
Git CMD:Windows风格的命令行。
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令。

*启动Git Bash时,360安全卫士会提示风险。

3、三个Bash操作命令
以下是最最基本的三个Bash操作命令:
pwd : 显示当前所在的目录路径
cd /e/github 进入E盘github目录
cd . . 回退到上一个目录
cd 直接进入默认目录
ls或ll: 列出当前目录中的所有文件,ll(两个小写字母l)列出的内容更为详细

最最基本的三个Bash操作命令

*更多的操作命令,请见文末。
*可以输入help命令来查看所有的操作命令,或“help 命令”来查看具体某个命令。

二、git操作的四个基本概念

Git本地有三个工作区域:工作目录(Working Directory或Workspace或Working tree)、暂存区(Stage或Index)、资源库(Repository或Git Directory)。
如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。
文件在这四个区域之间的转换关系如下:

git操作的四个基本概念

简单地说,就是:本地(你的电脑目录)与远程(服务器)两大块。
工作区workspace对应电脑中的一个目录(概念上不包括隐藏目录.git)。
暂存区Stage(或者Index)与资源库Repository对应电脑中此目录下的隐藏目录.git(版本库)。
(.git是存放Git管理信息的目录,初始化仓库时自动创建。)

git本地工作区概念的目录对应示例

所以初学者没事千万别去删除这个隐藏目录下的内容。
(如果你不想进行版本控制了,删除此文件夹即可。哈哈)

三、git 基本操作
1、github网上建仓库
登录github.com网站,建立一个新仓库(New repository),输入仓库名Repository name,点击Create repository即可。

建立新仓库

本例中仓库名为GitDemo,对应的url地址:https://github.com/loongoo/GitDemo.git

2、本地初始化仓库(git init)
回到本地(自己电脑上),使用Git Bash命令方式操作
用cd命令切换到要存放资料的目录下。本例中在E:\github
建立一个目录,并初始化仓库: git init 仓库名
这个仓库名与在github.com网站上建立的仓库名相同,实际上在本地也会是一个目录名称。
执行:
git init GitDemo
之后进入此仓库,并查看文件(当然是空的):
cd GitDemo
ls -l

本地初始化仓库

3、仓库状态与文件添加(git status/git add)
接下来,我们可以进行“复制/粘贴”操作,将协同开发文档放到此文件夹。

查看仓库状态:git status 或 git status -v
查看指定文件状态:git status 文件名
此命令时时刻刻会经常用到,操作查看状态必备。
会发现刚复制来的这些文件状态为:Untracked files(未跟踪文件)

添加指定文件到暂存区:git add 文件名
添加指定目录到暂存区,包括子目录:git add 目录名
添加当前目录的所有文件到暂存区:git add .
(此命令中 . 表示当前目录)

添加文件到暂存区

4、git操作中的文件状态


git操作中文件的四种状态示意图
  • Untracked:未跟踪, 此文件在文件夹中,但并没有加入到git库,不参与版本控制。
    通过git add状态变为暂存Staged状态。
  • Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。
    如果文件被修改,状态变为Modified。
    如果使用git rm --cached 移出版本库,则成为Untracked文件。
  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作。
    通过git add可进入暂存Staged状态。
    使用git checkout -- filename,则丢弃修改,返回到Unmodify状态,即从库中取出文件,覆盖当前修改。
  • Staged:暂存状态。
    执行git commit则将修改同步到库中,此时库中文件和本地文件变为一致,文件为Unmodify状态。
    执行git reset HEAD filename取消暂存,文件状态为Untracked或Modified。[1]
    具体何种状态取决于文件本来的状态。本来是新文件,未跟踪的,取消暂存后,依然是Untracked。如果文件已改动过(Modified),则取消暂存后会是Modified状态。简记之,哪里来,回哪里去。

思考:

  • 所谓文件已修改,前提是指这个文件参与了版本控制、本身并不是Untracked未跟踪文件。试想一个未跟踪文件,删除它,修改它,其实对版本控制都无影响,因为这个文件压根就没有参与版本控制。
  • 网上大量文章关于“暂存状态文件执行git reset HEAD filename后,状态变成Modified”的说法是片面的!请小心甄别。

下面以一个文件demo8.txt为例,演示一下文件状态的变化。

echo "file-8 demo" > demo8.txt
git status
git add demo8.txt
git status
git reset HEAD demo8.txt
git status
git add demo8.txt
git commit -m "demo8 first commit" demo8.txt
git status

echo "demo8 changed" >> demo8.txt
git status
git checkout -- demo8.txt
git status

git add demo8.txt
git commit -m "demo8 2nd commit" demo8.txt
git status
git rm --cached demo8.txt
git status

演示中几乎每条命令之后,都要用git status查看一下状态。对比观察发现变化。

文件状态演示操作

余下的操作,不截图了。

操作命令说明:
将暂存区的文件提交到版本库:git commit -m "提交注释" 文件名
将暂存区的文件撤回到工作区:git reset HEAD 文件名
恢复文件(从版本库中恢复覆盖工作区文件):git checkout -- 文件名
(这里的--前后都有空格,用来区别命令中的参数与文件名)
停止跟踪文件(删除暂存区文件,保留工作区的文件):git rm --cached 文件名

特别说明:
执行:git rm filename,会真的删除工作区的文件(物理文件),并将删除操作记录到暂存区(这很关键)。所以文件没了,还是可以恢复过来。
git rm能将文件从暂存区删除(加--cached参数),或者将文件从暂存区与工作区删除。
只想删除工作区的文件,可以用Bash下的rm filename命令来完成(见文末Bash基本操作命令)。

下例演示删除文件、恢复文件操作

准备工作:生成一个文件demo10.txt,并提交到版本库。

echo "add demo10" >demo10.txt
git add demo10.txt
git commit -m "add demo10" demo10.txt
git status
恢复演示操作前的准备

删除掉文件,ll查看文件demo10.txt已不存在。

git rm demo10.txt
ll
git status
git reset HEAD demo10.txt
ll
git checkout -- demo10.txt
ll

恢复成功。(将原先存入到版本库的文件恢复出来)

恢复演示操作

5、Git远程操作[2]

# 显示远程git仓库信息:此例中可以看到主机名origin,
# 远程地址:https://github.com/loongoo/GitDemo.git
git remote -v

# 获取远程git仓库的全部更新(通常用来查看其他人的进程,与自己的文件无影响)
git fetch origin
# 可以获取指定的分支(branch)。如获取origin主机上的master分支
git fetch origin master

# 查看获取的远程分支
git branch -r
# 查看所有的分支
git branch -a
# 本例中本地当前分支是master(前面有一个`*`号标识),远程分支是origin/master

# 在当前分支上合并远程分支
git merge origin/master

# git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。
# git pull <远程主机名> <远程分支名>:<本地分支名>
# git pull操作相当于先git fetch操作,再git merge操作。
git pull origin master:master

# 在git clone操作时,所有本地分支默认与远程主机的同名分支建立追踪关系(tracking),
# 也就是说,本地的master分支自动"追踪"origin/master分支。
# git pull origin master:master 可以简化成:git pull origin
# 如果当前分支只有一个追踪分支,则远程主机名都可以省略。
# 命令简化成:git pull

# 手动设定追踪关系
# 老式命令:git branch --set-upstream master origin/next
# 指定master分支追踪origin/next分支。
# 推荐命令:git branch -u origin/next
# 切换分支操作:git checkout 分支名
# 删除分支:git branch -d 分支名
# 不能删除当前分支,所以删除前需要先切换分支。

# git push命令将本地分支的更新,推送到远程主机
# 格式:git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master:master
# 当前分支与远程分支存在跟踪关系,则可简化成:git push origin
# 如果当前分支只有一个追踪分支,则远程主机名都可以省略。
# 命令简化成:git push

6、Git配置git config

# 显示git配置信息
git config -l

# 显示配置信息中的用户名
git config user.name

四、如何向GitHub贡献代码

远程开源仓库-自己的远程仓库-本地仓库

获取开源项目最新信息:
增加上游项目示例:
git remote add upstream https://github.com/pythonzhichan/DailyQuestion.git
其中upstream上游项目地址的别名。
(如果要删除上游项目,可以用命令:git remote remove <上游项目别名>
在本地获取upstream上最新的信息:
git fetch upstream
合并到本地分支:
git merge upstream/master

再推送到自己的网上仓库:
git push origin master

请参阅:作为GitHub初级用户,如何向GitHub贡献代码
https://foofish.net/how-to-contribute-to-open-source-in-github.html


附录A:

0、这是什么~?
~ 代字号或波浪号swung dash or tilde

1、Bash基本操作命令
cd改变目录
cd /d/github 进入D盘github目录
cd . . 回退到上一个目录
cd 直接进入默认目录
pwd : 显示当前所在的目录路径
ls 或ls -l 或ll: 列出当前目录中的所有文件,ll(两个小写字母l)列出的内容更为详细
touch新建一个文件
touch index.js 在当前目录下新建一个index.js文件
rm删除一个文件
rm index.js 删除index.js文件
mkdir新建一个目录
rm -r删除一个目录
rm -r src 删除src目录(包括文件,没有删除提示)
mv 移动文件
mv index.html src
此命令中index.html是我们要移动的文件, src是目标文件夹,index.html文件与src文件夹都在当前目录下
reset 重新初始化终端/清屏
clear 清屏
history 查看输入过的命令列表(命令历史)
help 帮助
exit 退出

2、一些问题的处理:
故障现象:git commit操作时出现失误,再次git commit时出现出错提示:
fatal: Unable to create ‘xxxxxx/.git/index.lock’: File exists.
解决:删除隐藏目录.git(版本库)下的index.lock文件。

git commit时忘写-m "注释",会进入注释书写状态,如何写入提交说明然后退出
按i然后输入commit注释内容,按esc键,输入:,然后再输入wq,按回车即可退出。
具体可参见:https://segmentfault.com/q/1010000005979356


参考文章:
[1]Git最详细篇-五星收藏
http://www.jianshu.com/p/e8a6c4e40b58 [注意:文件状态部份说法不全面,注意甄别]

[2]阮一峰的网络日志:Git远程操作详解
http://www.ruanyifeng.com/blog/2014/06/git_remote.html

Git常用命令备忘
https://foofish.net/git-command.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容