赞
踩
整理自https://www.atlassian.com/git/tutorials/setting-up-a-repository
Git的设置有三种生效范围:当前仓库、当前系统用户、当前系统。优先级递减。
如果添加了--global
标志,则设置生效范围是当前用户。如果没有添加,或者添加--local
标志,生效范围是当前仓库。
设置用户
git config --global user.name xxxx
git config --global user.email xxxx@xxxx.xxx
设置快捷命令
git config --global alias.ci commit
设置后git ci
就相当于git commit
仓库的创建可以通过新建和复制已有的远程仓库两种方式实现。
新建仓库
直接在指定目录下创建仓库,创建完毕会自动生成一个.git隐藏文件夹
git init
复制仓库
git clone <repo url>
repo url可以使用多种格式,比如Git SSH格式为
git@HOSTNAME:USERNAME/REPONAME.git
,
HTTPS格式为:
https://github.com/timshinlee/TagViewGroup.git
与git init
不同的是clone下来的仓库是与远程仓库绑定的了,可以直接push。
git remote add <remote_name> <remote_repo_url>
git status
可以查看当前目录的文件状态
文件有四种状态
Untracked files:
(use "git add <file>..." to include in what will be committed)
TestStash.txt
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: GitCommit.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: GitCommit.txt
git add <file>
缓存区的文件在调用commit
操作后会提交到工程历史当中。add操作用来指定哪些文件是要提交的。add后可以指定某个文件名,或者使用英文句号.代表添加所有文件。这个添加操作是添加修改后的文件到缓存区里,新建文件或者编辑文件后,该文件都会变成未添加状态。
如果要从缓存区中删除某个文件的话,可以使用移除命令
git rm --cached xxxx
添加完毕之后还需要提交才能真正保存修改。
git commit -m "xxxxx"
引号内为提交的说明
git push -u <remote_name> <local_branch_name>
可以把当前已修改但是又还没准备commit的内容保存保存起来,切换到其他地方,然后再切换回来。不管是staged或者unstaged的修改都会先回退到上一次commit的状态。
// stash之前
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: GitCommit.txt
// 进行stash
$ git stash
Saved working directory and index state WIP on master: 82562d1 second commit
HEAD is now at 82562d1 second commit
// stash之后
$ git status
On branch master
nothing to commit, working tree clean
stash操作是本地的,push到远程仓库的时候不会把stash内容页推送过去。
stash操作默认不会保存untracked和设置为ignored的文件。可以通过添加-u
或者--include -untracked
标志来保存untracked文件。也可以通过添加-a
或者--all
来保存包括ignored的文件。
第一种操作可以使用pop命令
// 恢复之前
$ git status
On branch master
nothing to commit, working tree clean
// 恢复操作
$ git stash pop
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: GitCommit.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (94c2f4e70957e2eef9ea21ef924229ab5b45b356)
pop操作就是把之前修改的内容应用到当前的工程,然后再移除掉。
第二种操作为apply,把之前修改的内容应用到当前工程,同时还保留不移除掉。这样子同一份修改可以同时应用在多个分支。
checkout对象可以是文件、commit或者分支。讲到checkout要引入一个HEADER概念,HEADER正常状态下指向master分支或者某个子分支。
1. checkout文件
git checkout <commit> <file>
单独检出一个文件到当前工作目录,与checkout commit不同,会影响当前状态,此时可以把检出的文件提交到下一次commit,所以检出单个文件相当于把这个文件回退到某个commit的状态。
2. checkout commit
git checkout <commit>
更新当前工作目录到完全匹配指定的commit。检出commit是进入到那个commit,并不会影响已有分支。参数可以使用commit的哈希值或者使用tag名称。
checkout commit会使正常指向分支的HEADER指向某个commit,就会进入一个”detached HEADER”的状态。
3. checkout分支
git checkout master
git revert <commit>
git revert并不会影响操作历史,而是把某个commit的操作逆向操作一遍,使文件恢复原状,然后再commit一次。
比如说某个bug是由于某个commit产生的,此时可以revert那个commit解决bug。
revert操作可以指定某个任意的commit。
reset才是真的撤销某个commit。与revert不同,reset只能从当前的commit往回撤销。如果要撤销指定某个中间点的commit,只能撤销这中间的所有commit,然后再把那些不需撤销的重新commit一次。
reset操作要谨慎使用,因为这会导致reset掉的commit无法恢复。reset操作应该只对本地文件使用,禁止对与其他开发者分享的文件进行reset操作。
git reset <file>
从缓存区移除掉指定的文件,对于当前工作目录没有任何影响。
git reset
重置缓存区以匹配最近的commit,对于当前工作目录没有任何影响。
git reset --hard
重置缓存区和工作目录以匹配最近的commit,--hard
标志表示覆盖所有修改的地方,所有未提交的修改都会被删除掉。
git reset <commit>
把当前分支回退到某个commit的状态,重置缓存区至指定commit状态,但是工作目录是不变的,所以可以一次性重新提交。
git reset --hard <commit>
把当前分支回退到某个commit的状态,重置缓存区和当前工作目录至指定commit状态,指定commit之后的commit都会被删掉。
revert可以用来安全地撤销一个公共的commit,reset是用来撤销本地的修改。如果commit被push到远程仓库了,就最好不要用reset来撤销。
用来删除本地那些untracked文件
git clean -n
列出预删除列表
git commit --amend
git commit --amend
可以用来对最近一次的commit进行修改,提交一些当前的修改进去而不用进行一次新的提交。如果当前没有修改的话就可以用来修改修改commit的信息。
不过实际上,amend命令是用修改过的commit完全替换旧的commit的,对于git来说相当于全新的commit。
但是有个关键点要记住,不要修改已经push的commit。amended commit实际上是一个新的commit,旧的commit会从工程历史中移除掉。如果修改已经push的commit,后果跟reset这个commit是一样的,如果其他开发者基于这个commit进行修改,会导致复杂的情况。
git rebase
rebase是一个把当前分支移动到其他commit上,如下图所示:
从内容的角度上来讲,rebase只是把分支移动到其他commit上,但是实际上是通过创建一个新的commit,然后把这个commit应用到指定的基础上,所以是重写了工程历史。
git rebase <base>
把当前分支重定基址,可以重定到任意形式的commit引用,比如一个哈希id,分支名称,tag名称或者对于HEAD的相对引用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。