git的几十个基本面

 

1、下载git?
git-scm.com

2、获取帮助
git help
git help config

3、什么是Git?
版本控制系统,Version Control System, VCS。它允许我们提交变化到源代码管理库,并且跟踪变化。允许develope在同一套代码库上协同工作。是现代的、分布式版本控制系统。

4、一些关键词?
Branch
Merge
Commit:发生在本地
Push
Pull

5、git的历史
创建于2005年,一开始Linux kernel使用BitKeeper作为版本控制系统,后来Linus kernel和BitKeeper拆分,BitKeeper的拥有公司无法再提供免费服务,Linux需要一个新的版本控制系统替代BitKeeper,Linux的程序员们开始重造轮子,并在以后完善了社区,并诞生了GitHub.

6、CVS和DVC?
CVS是Centralized Version Control,程序员们向同一台中央服务器提交;DVC是Distributed Version Control,每个人都有自己的代码控制库,每次提交是提交到本地的,每次提交了一个新版本的代码,然后是push到远程。多人协作的一个场景:A和B协同工作,A把代码commit到本地,B直接从A的本地代码库pull,当A完成阶段工作,push到远程代码服务器,B现在可以从远程代码库pull代码了。

7、一些命令?
init,创建本地代码库
status,本地代码库的状态,显示没有commit的变化
add,把文件放到本地代码库
commit,把变化提交到本地代码库
log,显示提交的所有变化
push,push所有的变化到远程代码服务器,还可以提交到多个地方
pull,从远程代码服务器或其它代码库pull变化
merge,合并变化

8、git配置

git config --global user.name "darren"
git config --global user.email "764190362@qq.com"
git config --global --list

信息被存放在了管理员文件夹中的.gitconfig文件中,大致是:
[user]
    name = darren
    email = 764190362@qq.com

git config --global core.editor note 使用哪个编辑器
git config --global help.autocorrect 1 当出现错误命令会有提示
git config --global color.ui auto 设置字体颜色等
git config --glboal core.autocrlf false windows下推荐使用

以上的设置是System级别的。

还可以设置用户级别的,用户级别可以覆盖System级别。

git config user.name "jack"

用户级别移除设置:git config --unset core.autocrlf

9、创建本地代码库, 追加文件, 提交变化

→ 来到某个文件夹,打开命令行窗口
→ 创建本地代码库
git init
→ 在文件夹内创建一个README.txt文件
→ 查看本地代码库的状态
git status
红色字体表示没有被tracked的文件
→ 把文件添加到本地代码库,使文件可以被track
git add README.txt
git add -u 用来add刚被更新的文件,而不是刚添加的文件
git add -A add所有文件到staging area被track等待被commit
此时,再运行git status,README.txt变成绿色,说明已经被track
→ commit变化
git commit
→ 查看历史
git log

10、历史版本和版本差异

→ 查看历史版本
git log
→ 查看版本差异
git diff dd6819..a15ec6
→ 查看最近的历史版本
git diff HEAD
→ 查看最近的历史版本之前的版本
git diff HEAD~1
→ 查看最近历史版本和之前一个版本的差异
git diff HEAD~1..HEAD
也可以写成
git diff HEAD~1..

11、一次修改多次提交

→ 假设修改了2个文件
README.txt
file.txt
→ 查看状态
git status
此时可以看到修改的文件呈红色状态。通常一次commit就好,但这里就分两次commit
→ 第一次add
git add file.txt
→ 第一次commit
git commit -m "blablabla"
→ 第二次add
git add README.txt
→ 第二次commit
git commit -m "second blablabla"

12、删除文件
→ 删除file.txt文件
→ 查看状态
git status
deleted file.txt 并且是红色字体
→ 把删除也放到staging area
git add -u
→ 查看状态
git status
deleted: file.txt 并且是绿色字体
→ commit
git commit -m "blablabla"

也就是说,对于删除的文件,也需要使用git add -u,把删除的文件放在staging area。

13、重命名文件
→ 把file.txt重命名为newfilename.txt
→ 查看状态
git status
deleted: file.txt 红色字体(被重命名的文件在git看来是deleted状态)
nefilename.txt 红色字体(新的文件在git看来是一个untracked状态)
→ 把deleted状态的文件和新文件放到staging area上去
git add -A
→ 查看状态
git status
renamed: file.txt → newfilename.txt 绿色字体(git 记录下了重命名过程)
→ commit一下
git commit -m "blablabla"

14、撤销改变
→ 修改某个文件,比如README.txt
→ 查看状态
git status
modified: README.txt 红色字体
→ 撤销修改
git checkout README.txt

15、撤销多个改变
→ 修改某个文件,比如README.txt
→ 删除某个文件,比如newfilename.txt
→ 查看状态
git status
modified: README.txt 红色字体
deletedL newfilename.txt 红色字体
→ 撤销这2个改变
git reset -hard
→ 查看状态
git status
回到最近的一次HEAD

16、删除文件
→ 创建文件
temp1.txt
temp2.txt
→ 查看状态
git status
temp1.txt 红色字体
temp2.txt 红色字体
→ 删除文件
git clean -f

17、忽略文件
→ 假设创建logs文件夹和线面的log.txt
→ 查看状态
git status
logs/ 红色字体
→ 创建.gitignore文件,内容如下:
/logs/*.txt
/logs/*.log
→ 查看状态
git status
.gitignore 红色字体
→ 把.gitignore文件放到staging area
git add .gitignore
→ 提交
git commit -m "Added .gitignore"

18、拷贝远程网站到本地
→ 拷贝
git clone https://github.com/jquery/jquery.git
→ 查看所有的提交
git log
git log --oneline

19、查看数据
→ 查看总共多少次提交
git log --oneline | wc -1
→ 查看带图标
git log --oneline --graph
→ 查看哪些人提交了哪些
git shortlog
→ 查看哪些人以及邮件
git shortlog -sne
→ 查看更多
比如在github网站上,有一个Graphs菜单,里面有更详尽的信息。

20、查看提交
→ 展示最后一次提交
git show HEAD
→ 展示倒数第二次提交
git show HEAD~1
→ 展示所有提交
git log --oneline
→ 展示最后10次变化
git show HEAD~10
→ 展示某一次提交
git show 5642626
→ 查看远程
git remote
origin 远程名称为origin的代码库
→ 查看远程更多
git remote -v
origin https://github.com/jquery/jquery.git(fetch)
orgin https://github.com/jquery/jquery.git(push)

21、Git Protocol

● git支持http、https、git、ssh和file协议
● http的默认端口是80,https的默认端口是443,可以设置
● 对于比如说github上的网站,通常读取是自由的,但写通常需要密码
● git protocol
git 9418 git://github.com/jquery/jquery.git
● ssh protocol
ssh 22 git@github.com:jquery/jquery.git
● file protocol
file n/a /Users/James/code/jquery

22、查看分支和标签
→ 查看本地分支
git branch
→ 查看远程分支
git branc -r
→ 查看tag
git tag
可以看到所有版本

23、本地代码库复制到远程,在远程创建代码库
→ 在本地代码库基础上创建远程代码库
git remote add origin https://github.com/Darrenji/example.git

24、从远程fetch
→ fetch
git fetch
把远程所有变化拉到本地
→ fetch某个分支
git fetch origin

25、远程变化同步合并到本地
→ 远程有一个变化,有可能是另外一个程序员提交
→ 同步合并到本地
git merge origin/master

26、从远程拉
→ 查看远程分支
git branch -r
origin/master 红色字体
→ 现在准备拉pull,pull等同于:git fetch; git merge origin/master
→ 建立远程和本地的映射
git branch --set-upstream master origin/master 第一个master是指本地
→ 开始拉
git pull

27、推到远程
→ 本地提交一些变化
git commit -am "blabla"
→ 推
git push
输入用户名
输入密码

当然还可以在推之前删除远程
→ 删除远程
git remote rm origin
→ 列出远程
git remote -v
→ 重新创建一个SSH协议的远程
git remote add origin git@github.com:Darren/Example.git
→ 推
git push

注意:SSH协议这里使用SSH key进行认证用户

28、创建标签
→ 创建标签
git tag v1.0
git tag -a v1.0_with_message
git tag -s v1.0_signed
→ 列出所有标签
git tag
→ 列出某个标签
git tag -v v1.0_signed

29、把标签推到远程
→ 默认情况下git不推标签
git push --tags

30、可视化分支
→查看现有分支下的提交
git log --graph --oneline
→ 查看所有分支下的提交
git log --graph --oneline --all --decorate
--all所有分支
--docorate比如HEAD,tag等

还可以把以上的选项放到全局去并使用别名调用:
→ 全局设置
git config --global alias.lga "log --graph --oneline --all --decorate"
→ 使用新的命令
git lga

31、创建本地分支
→ 创建本地一个分支
git branch feature1
→ 跳转到feature1这个分支
git checkout feature1
→ 查看所有分支下的提交
git log --graph --oneline --all --decorate

32、分支和标签的区别
branch会跟着commits,tag始终跟着一个commit。

→ 创建一个分支并让它跟着一个commit
git branch fix1 974b56a
→ 切换到fix1
git checkout fix1
→ 修改fix1下的某个文件
→ 提交
git commit -am "blabla"

33、重命名和删除分支
→ 重命名分支
git branch -m fix1 bug1234
→ 删除分支
git branch -d bug1234
→ 想git报告删除分支的事
git branch -D bug1234
→ 创建并切换到新创建的分支
git checkout -b feature2

34、把删除的分支找回来
→ 输入如下
git reflog

5a78c8b HEAD@{3}: commit: Fixed bug#1234
→ 找回分支
git branch bug1234 5a78c8b
→ 切换到找回的分支
git checkout bug1234
→ 展示HEAD
git show HEAD

注意:commit保存期只有30天

35、不提交变化隐藏变化
→ 修改某个文件,比如README.txt
→ 查看状态
git status
modified: README.txt 红色字体
→ 隐藏变化
git stash
→ 查看隐藏的所有变化
git stash list

36、创建远程分支
→ 推到远程的某个分支上
git push origin master
→ 把本地branch推到远程
git push origin v1.0_fixes
远程会多了一个分支
→ 查看远程分支
git branch -r

37、删除远程分支
→ 先推到远程分支
git push origin v1.0_fixes
git push origin v1.0_fixes:v1.0_fixes_remote_branch_name(远程和本地分支名称不一样)
→ 删除远程分支
git push origin:v1.0_fixes_remote_branch_name

38、git网站设置
通常在git网站,比如github, coding.net都会有一些基本设置的地方。

========最近又作了一些git的练习,整理在下面====================================================

1、Repository包含什么

文件、历史记录、配置文件

2、git repository的3个状态

● working directory:通常有一个隐藏的.git文件
● staging area:也叫git index
● commit

3、master branch

8d976fa→626968e→65a7416→a877955→1bf9179
默认的brach叫master

4、Windows安装git

git-for-windows.github.io
安装完后打开git bash,输入:git version

5、简单使用

→ 在github上创建一个new repository
→ 创建目录
mkdir projects
→ 导航到目录
cd projects/
→ 全局配置
git config --global user.name ""
git config --global user.email ""
git config --global --list
→ 复制远程git repository的地址
→ 复制到本地
git clone https://github.com/demo/demo.git
→ 查看本地repository的状态
git status
一般是On branch master,默认显示名称为master的这个branch
→ 创建文件
echo "some words" >> start.text
→ 查看文件列表
ls
→ 显示文件
cat start.txt
→ 查看状态
git status
start.txt为红色字体,表示untracked file,也就是说在working directory,还没有在staging area
→ 放到staging area中去
git add start.txt
→ 查看状态
git status
start.txt为绿色字体,表示已经在staging area中了
→ 提交
git commit -m "adding start txt file"
→ 提交到远程
git push origin master
远程的名称是origin,在从远处拷贝过来的时候默认就是这个名称
master是默认的远程分支

6、从本地的一个空目录开始

→ 创建一个目录
→ 初始化并创建一个git目录
git init fresh-project
→ 来到刚创建的fresh-project,查看所有文件,包括隐藏文件
ls -al
发现有一个.git目录
→ 来到.git目录,查看
branches/
→ 来到fresh-project目录,查看状态
git status
On branch master告诉我们目前在master这个branch上,我们是可以创建其它branch的
→ 创建一个新文件hipster.txt
→ 查看状态
git status
hipster.txt为红色字体,表示这个是untracked file
→ 放到staging area中去
git add hipster.txt
→ 查看状态
git status
new file: hperster.txt 绿色字体
→ 提交
git commit -m ""
[master (root-commit) a7781a] ..., root-commit表示是第一次提交

7、从本地的一个已有项目开始

→ 下载一个示例项目
http://initializr.com
→ 比如下载项目在一个名称为web-project的目录中
→ 来到web-project目录下
git init
→ 查看列表,包括隐藏文件
ls al
.git/目录存在着
→ 查看状态
git status
On Branch master
→ 把所有文件放到staging area
git add .
→ 提交变化
git commit -m ""

8、从远程的一个git项目开始

→ 远程的git项目
https://githbu.com/scm-ninja/starter-web
→ 点击Fork按钮把项目加入到自己的github账户下
→ 复制https url
→ 拷贝到本地
git clone https://github.com/somename/starter-web.git

9、简单使用add, commit, pull, push

→ 本地一个git目录
→ 创建一个新文件hipster.txt
→ 查看状态
git status
hipster.txt红色字体
→ add
git add hipster.txt
→ commit
git commit -m ""
[master ba5b0f0],master是默认的分支,ba5b0f0是SHA-1,用来标记每一次提交
→ 从远程拉取
git pull origin master
强烈推荐养成的习惯:commit之后,先pull,再push
→ 推到远程
git push origin master
5c05047..ba5b0f0 master → master, 表示从本地的master默认分支推送到远程的master分支

10、git的tracking files

→ 输入如下查看git repository tracking的所有文件
git ls-files
→ 把多个修改放到staging area
git add .


11、回滚提交的变化

→ 从staging area中移除
git reset HEAD level1-file.txt
→ 回滚
git checkout -- level1-file.txt

12、重命名文件

→ 重命名,比如把level3-file.txt重命名为level3.txt,使用git的重命名命令
git mv level3-file.txt leve3-file.txt
→ 查看状态
git status
renamed: level3-file.txt → level3.txt,绿色字体
也就是重命名后,依然在staging area,不需要重新add
→ 提交变化
git commit -m ""


→如果使用操作系统的命令,重命名某个文件
mv level2-file.txt leve2.txt
→ 查看状态
git status
deleted: level1-file.txt 红色字体
level2.txt 红色字体
说明档使用操作系统的命令,会删除原先的,并且创建一个新的,并且被删除的和新建的都不在staging arean
→ add
git add -A
→ 提交变化

移动文件也是相似的道理。

13、移除文件

→ 创建一个文件doomed.txt
→ git status
doomed.txt红色字体
→ 使用git命令移除
git rm doomed.txt
提示无法移除,因为还没有tracking这个文件呢
→ 那就使用操作系统命令删除
rm doomed.txt
→ ls
没有
→ git status
也没有
也就是说,刚创建的文件没有被tracking,使用操作系统的删除命令是可以的


如果删除一个被tracking的文件呢?

→ 查看所有正在被tracking的文件
git ls-files
比如有一个newfile.txt文件
→ 使用git命令删除
git rm newfile.txt
→ 使用ls命令,已不再目录中
→ 使用git status
deleted: newfile.txt 绿色字体
→ git commit -m "",也就是让repository知道这个文件已被删除
→ 使用git status
没有
也就是说,使用git的rm命令删除staging area中的文件,也是物理删除,执行命令后必须告诉或同步到repository,commit一下

tracking中的文件被删除,如何回滚呢?


→ 查看所有正在被tracking的文件
git ls-files
比如有一个hipster.txt文件
→ 使用git命令删除tracking的文件
git rm hipster.txt
→ ls
发现不在目录中了
→ git status
deleted: hipster.txt 绿色字体,说明这个文件也在staging area了,对git来说,这个文件还没有被真正删除
→ 此时想把这个文件从staging area中拉出来
git reset HEAD hipster.txt
→ ls
依然不在目录中
→ git status
deleted: hipster.txt 红色字体,说明这个文件依然被track,但在目录中已经不存在。注意从staging area中拉出来和是否是tracking是两码事。
→ 回滚
git checkout -- hipster.txt

注意:如果我们想回滚,先必须使用reset HEAD命令把文件从staging area中拉出来
→ ls目录中存在文件,git status发现文件不再被track

如何删除目录呢?

→ 比如有一个目录是level1
→ rm -rf level1
→ ls查看,目录已经没有
→ git status
deleted: leve1/leve1.txt 红色字体
deleted: leve11/level2/level2.txt 红色字体
deleted: level1/level2/level1/level3.txt 红色字体

level1以及子目录都标记为删除,还在track状态,但并不在staging area中
→ git add -A

deleted: leve1/leve1.txt 绿色字体
deleted: leve11/level2/level2.txt 绿色字体
deleted: level1/level2/level1/level3.txt 绿色字体

在track状态,并且在staging area了,准备提交
→ 提交变化

14、git历史记录

→ 查看语法
git help log
→ git log
查看到所有的提交记录
→ git log --abbrev-commit
查看精简的commit编号
→ git log --oneline --graph --decorated
→ git log ae6f872...761b911
→ git log --sicne="3 days ago"
→ 查看某个文件的历史记录
git log -- hopster.txt
→ git log --follow -- level1/level2/level3
→ 查看某次提交
git show b19...

15、别名

→ 比如本来查看历史记录的这样写
git log --all --graph --decorate --oneline
可不可以写成 git hist来得到相同的结果呢?
→ 在全局配置
git config --global alias.hist "log --all --graph --decorate --oneline"
→ 使用别名命令
git hist
→ 如何修改别名命令呢
实际上是存在在.gitconfig文件中,类似:
[alias]
hist = log --all --graph --decorate --oneline

16、忽略不必要的文件

→ 存放在哪里呢
.gitignore
→ git add .gitignore
→ git status
new file: .gitignore
→ git commit -m ""
→ 来到.gitignore文件
*.log

17、推送
→ 先拉取
git pull origin master
→ 再推送
git push origin master

 

posted @ 2016-02-20 22:57  Darren Ji  阅读(1343)  评论(0编辑  收藏  举报

我的公众号:新语新世界,欢迎关注。