Git早期笔记1
Git 简介
SCM:source code management
VCS:Version Control System
CVCS:Centralized Version Control System
DVCS:Distributed VCS
Git之前是cvcs, svn
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
https://git-scm.com
Git所涉及的概念
- 工作区(workspace/working directory)
- 项目目录中除了./git不包含在内外,其他文件均为工作区文件。
- 暂存区(Index/stage)[stage 原意”舞台”]
- .git/index
- 当在一个空目录中创建Git工作环境时,此时是没有.git/index文件的。git add后就有了。
- 版本库/仓库(repository)
- 这个仓库被Git所管理,用户所做的几乎任何操作均被Git所记录,以便于用户还原(后悔药)。
- 远程仓库(remote)
- 作者
- 实际做出修改的人
- 提交者
- 将工作成果提交至仓库的人
- fork
- 将别人的仓库复制一份到自己的仓库。
- clone
- 将github中的仓库克隆到自己本地电脑中。
Git的安装
- 将github中的仓库克隆到自己本地电脑中。
sudo apt-get install git
git版本查看/git安装成功验证:
git --version
Git的配置
-
面向所有用户的默认配置
git config --system user.name "用户名"
配置文件:/etc/gitconfig
查看: git config –system –list -
面向本用户的配置
git config --global user.name "用户名"
配置文件:~/.gitconfig
查看:git config --global --list
-
当前项目的配置
git config --local user.name "用户名" ( --local 可以省略)
配置文件:./.Git/config 文件中修改
查看:git config --list
此用户名 和 邮箱 是git提交代码时用来显示你身份和联系方式的,并不是github用户名和邮箱
为项目目录添加Git
-
方法1,新建一个目录作为Git的工作目录:
-
mkdir myGitTest;
-
cd ./myGitTest
-
git init
-
-
方法2,为一个已存在的目录配置Git:
git init [已存在的目录]
-
方法3,下载一个项目和它的整个代码历史:
git clone [url]
git clone url [本地文件夹名字]
Git的使用
向暂存区添加文件
-
添加指定文件到index
git add [文件]
-
添加指定目录到index
git add [目录]
-
添加当前目录所有文件、目录到暂存区
git add .
删除文件
-
git rm 适用于已经被追踪的文件,rm 工作区都删掉,文件将不在工作区保留
git rm [文件]
-
–cached 不再追踪,保留在工作区,文件将保留在工作区,未被追踪状态
git rm --cached [文件]
改名
git mv [original-name] [target-name]
代码提交至仓库
-
提交暂存区所有文件至仓库
git commit -m [message]
-
提交暂存区指定文件至仓库
git commit [file1][file2] [file3] ... -m [message]
-
所有已存在于仓库中的文件,经过修改后,添加到暂存区并提交
git commit -a -m [message]
git commit -am [message]
-
取消上次提交,重新提交/覆盖上一次的提交,使用一次新的提交,替代上一次提交。如果代码没有变化,则更改提交信息
git commit --amend -m [message]
-
修改内容add后,本次提交将包含在上一次提交中,本次提交无提交信息
git commit --amend
-
提交之前 查看本次提交后的内容变更,并不提交(不写文件名则默认为暂存区所有文件)
git commit -v [file1][file2] [file3] ...
分支(branch)
-
列出分支
- 本地分支:git branch
- 远程分支:git branch -r
- 本地+远程:git branch -a
-
新建分支
- 但依然停留在当前分支
git branch [branch-name]
- 并切换到该分支
git checkout -b [branch-name]
- 新建一个分支,并与指定的远程分支建立追踪关系
git branch --track [local-branch-name][remotebranch]
- 但依然停留在当前分支
-
切换分支
- 切换到指定分支,并更新工作区
git checkout [branch-name]
- 切换到上一个分支(同linux的cd命令)
git checkout -
- 切换到指定分支,并更新工作区
-
建立追踪关系,在现有分支 与 指定的远程分支之间
git branch --set-upstream [local-branch][remote-branch]
-
合并
- 合并指定分支到当前分支
git merge [branch]
- 合并指定分支到当前分支
-
删除分支
- 删除本地分支
git branch -d [branch-name]
- ???删除远程分支
git push origin -delete [branch-name]
git branch -dr [remote-branch]
- 删除本地分支
-
改
- 重命名当前分支名 move/rename a branch and its reflog
git branch -m [new branch name]
- 重命名当前分支名 move/rename a branch and its reflog
标签
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
创建的标签都只存储在本地,不会自动推送到远程。
增
git tag [name]
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
git tag [name][commit-number]
- 创建带有说明的标签,-a 指定tagname,-m指定说明文字
git tag -a [tagname] -m ["说明性文字"]
删
- 本地删除
git tag -d [tagname]
- ???远程的删除
先从本地删除,然后push
例如:git push origin :refs/tags/[tagname]
改
- 推送某个标签到远程
git push [远程主机名][tagname]
- 推送全部
git push [远程主机名] --tags
查
- 查看所有标签
git tag
- 查看某个标签
git show [tagname]
查看提交历史
-
显示有变更的文件
git status
git status -s || git status --short
-
显示当前分支的版本历史
- 完整显示
git log
- 简短显示
git log --pretty=oneline || git log --oneline
- 最近number次提交历史
git log -number
- 指定文件相关的每一次diff
git log -p [file]
- 显示某个文件的版本历史
git whatchanged [file] || git log --follow [file]
- 显示所有提交过的用户及次数
git shortlog
- 按照次数排序
git shortlog -sn
- 完整显示
-
工作区 和 暂存区 的差异
- git diff Show changes between commits, commit and working tree, etc
- 某个文件
` git diff [file]` - 所有文件
git diff
- 某个文件
- git diff Show changes between commits, commit and working tree, etc
- 暂存区 和 上一次commit 之间的差异
- 某个文件
git diff --cached/--staged [file]
- 所有文件
git diff --cached
- 某个文件
- 工作区 和 当前分支 上一次commit 之间的差异
- 某个文件
git diff [commit][file]
- ???所有文件
git diff HEAD
- 某个文件
-
两个commit之间的差异
git diff [commit1][commit2]
-
显示当前分支的最近几次提交(包括amend)
- 某个文件
git reflog [file]
- 所有文件
git reflog
- 某个文件
本地仓库 VS 远程仓库
-
本地推送至远程
第一次需要添加-u:–set-upstream
git push -u [远程主机名][本地分支名]:[远程分支名]
git push [远程主机名][本地分支名]:[远程分支名]
如果远程分支不存在将会被创建
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
如果省略远程分支名,则表示将本地分支推送到与之存在Tracking的远程分支。 -
到远程仓库中拉取对应你本地仓库中还没有的数据。
git fetch [remote]
-
取回远程仓库的变化,并与本地分支合并
git pull [remote][branch]
远程仓库
git remote :为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
增
-
增加一个新的远程仓库,并命名
git remote add [远程主机名shorname][url]
-
???上传本地分支到远程仓库(远程仓库如果没有本地的这个分支呢?)
git push -u [远程主机名][本地分支名]:[远程分支名]
-
推送本地所有分支到远程仓库
git push [remote] --all
删
删除添加的远程仓库(切断与远程仓库的联系)
`git remote remove [remote-name]`
改
-
重命名远程仓库
git remote rename [old name][new name]
-
修改本地仓库指向的远程仓库
git remote set-url [remote-name][new url]
例如:git remote set-url origin https://www.google.com
查
-
显示所有远程仓库
git remote
-
列出详细信息,在每一个名字后面列出其远程url
git remote -v -
显示某个远程仓库的详细信息
git remote show [remote]
一点点思考
- 本地创建项目,上传到远程仓库
- 在远程端创建一个全新的repository,没有任何文件
git remote add github 地址
- git push -u github
ssh
SSH地址形如:git@gitee.com:billscofield/billtest.git
mkdir ~/.ssh
(其实叫什么都无所谓,网上搜的基本上都这么配置)cd ~/.ssh
ssh-keygen -t rsa -C "ur email"
- 将id_rsa.pub里面的内容复制下来, copy 到 github 的 add keys 里。
- 测试连接
ssh -T git@github.com
选择 yes
一点点思考
- https地址换成ssh
- ssh换成https
撤销/回滚
- to checkout 只能是已经被追踪了的文件,新的未被追踪的文件是不行的
- 单个文件
git checkout -- [filename]
- 所有暂存区文件到工作区
git checkout .
to discard changes in working directory
撤销工作区的修改一种是 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
- 单个文件
-
git checkout – file命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
-
to unstage
git reset HEAD [file]
把暂存区的修改撤销掉(unstage),重新放回工作区,就是撤销之前的add -
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
git reset [mode][commit]
This form resets the current branch head to <commit> and possibly updates the index (resetting it to the tree of <commit>) and the working tree depending on <mode>. If <mode> is omitted, defaults to “–mixed”. The <mode> must be one of the following:-
–soft
Does not touch the index file or the working tree at all (but resets the head to <commit>, just like all modes do).This leaves all your changed files “Changes to be committed”, as git status would put it. -
–mixed
Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.
If -N is specified, removed paths are marked as intent-to-add (see git-add(1)).
- –hard
Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.
工作区中已被追踪的文件将回退至commit,未被追踪的文件将得以保留
???已被追踪的含义是:add 过 -
–merge
Resets the index and updates the files in the working tree that are different between <commit> and HEAD, but keeps those which are different between the index and working tree (i.e. which have changes which have not been added). If a file that is different between <commit> and the index has unstaged changes, reset is aborted.In other words, –merge does something like a git read-tree -u -m <commit>, but carries forward unmerged index entries.
- –keep
Resets index entries and updates files in the working tree that are different between <commit> and HEAD. If a file that is different between <commit> and HEAD has local changes, reset is aborted.
If you want to undo a commit other than the latest on a branch, git-revert(1) is your friend.
-
Stashing(储藏)
增
git stash
删
git stash drop stash@{number}
查
git stash list
应用
-
git stash apply stash@{number}
-
在apply的基础上对这个进行了删除
git stash pop stash@{number}
国内外代码托管平台汇总
国外
国内
小考题
-
git rm [file] 是不用 add 的,这个 [file] 肯定是被追踪了的,不然就用不到 git 了
-
origin/master
-
git push
git push <远程主机名> <本地分支名>:<远程分支名>
git remote add origin git@gitee.com:billscofield/billtest.git
git push orgin master
也可以不给远程主机起名字,直接push 地址
git push git@gitee.com:billscofield/billtest.git master
-
git pull
git pull <远程主机名> <远程分支名>:<本地分支名>
-
项目管理
-
首先是同一个平台的用户
-
项目所有者邀请
-
-
本地仓库behind远程仓库,怎么push
-
切换分支切换的是版本库,新加的文件最好add ,然后 git stash
-
ssh是什么
-
–cached
- git rm –cached [file] 在index上进行删除
- git diff –cached [file] 暂存区和上一commit的差异