客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
对于任何一个文件,在 Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。
已修改:表示修改了某个文件,但还没有放到暂存区域。
已暂存:表示修改了某个文件,并且已经放到暂存区域。
已提交:表示该文件已经被安全地保存在本地仓库中了。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:工作目录,暂存区域,以及本地仓库。
$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]
要想获得 config 命令的手册,执行
$ git help config
$ git clone git://github.com/schacon/grit.git
如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
未跟踪(Untracked):Git在之前的快照(提交)中没有这些文件;
已跟踪(tracked):本来就被纳入版本控制管理的文件,在上次快照中有它们的记录。工作一段时间后,它们的状态可能是未更新(unmodified),已修改(modified)或者已放入暂存区(staged)。
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add ..." to include in what will be committed)
newfile.md
nothing added to commit but untracked files present (use "git add" to track)
Untracked files:未跟踪文件
GIt不会自动将新建文件纳入跟踪范围,除非你明确声明跟踪该文件,因而不用担心把临时文件什么的也归入版本管理。
使用命令 git add 开始跟踪一个新文件。
$ git add newfile.md
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: newfile.md
Changes to be committed:已暂存。
查看一下,如果清理的话,交付清理哪些文件
git clean -nf
如果确定上一步的的操作列表里都是没用的,再清理
git clean -f
现在我们修改之前已跟踪过的文件 benchmarks.rb,然后再次运行 status 命令
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: newfile.md
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: benchmarks.rb
Changes not staged for commit:已修改(modified),说明已跟踪文件的内容发生了变化,但还没有放到暂存区。
撤销指定文件
$ git checkout file-name
撤销所有文件
$ git checkout .
要暂存这次更新,需要运行 git add 命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区)
$ git add benchmarks.rb
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: benchmarks.rb
new file: newfile.md
现在两个文件都已暂存,下次提交时就会一并记录到仓库。
再次修改benchmarks.rb文件(添加注释),然后运行git status:
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: benchmarks.rb
new file: newfile.md
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: benchmarks.rb
benchmarks.rb 文件出现了两次!一次算未暂存,一次算已暂存,这怎么可能呢?
实际上 Git 只不过暂存了你运行 git add 命令时的版本,如果现在提交,那么提交的是添加注释前的版本,而非当前工作目录中的版本。所以,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来:
git add benchmarks.rb
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: benchmarks.rb
new file: newfile.md
放弃指定文件的缓存
git reset HEAD filepathnam
放弃所有的缓存
git reset HEAD .
git diff:查看修改之后还没有暂存起来的变化内容
git diff --cached :比较已经暂存起来的文件和上次提交时的快照之间的差异。(即:git diff --staged)
现在的暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。
$ git commit -m 'the reason'
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
$ git commit -a -m 'the reason'
退到上一次commit的状态
git reset --hard HEAD^
你可以使用 git log 命令来查看git的提交历史。
git reset --hard commitid
$ git clone https://github.com/schacon/ticgit
$ git remote
origin
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
git remote add nogossun https://github.com/paulboone/ticgit
$ git fetch [remote-name]
$ git push origin master
$ git remote rename pb paul
$ git remote rm paul
$ git branch
git branch 分支名,例如:git branch test_branch
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
git checkout 分支名,例如从master切换到分支:git checkout test_branch
$ git branch -a
git branch -b 'my_branch'
$ git branch -d
git pull origin dev
git checkout -b 本地分支名 origin/远程分支名
git push 仓库名称(origin )分支名称
git pull origin master:my_test
将origin厂库的master分支拉取并合并到本地的my_test分支上。
如果省略本地分支,则将自动合并到当前所在分支上。如下:
git pull origin master
首先,查看该文件相关的commit记录
git log -- filename
可以显示该文件每次提交的diff
git log -p filename
查看某次提交中的某个文件变化
git show commit-id filename
使用git pull或者git push每次都需要输入用户名和密码很不人性化,耽误时间,现在教大家一条命令实现保存用户名和密码不用再输入
git config --global credential.helper store
git pull /git push (这里需要输入用户名和密码,以后就不用啦)
push你的代码 (git push), 这时会让你输入用户名和密码, 这一步输入的用户名密码会被记住, 下次再push代码时就不用输入用户名密码 ! 这一步会在用户目录下生成文件.git-credential记录用户名密码的信息。
git config --global credential.helper store