Git
初始化git本地仓库:git init
查看working directory和staging area的状态:git status
添加文件到staging area:git add <file> [...] // file means document and folder. "..." means containing lots of parameters.
检查不同:
git diff // differ working directory and staging area
git diff HEAD // differ working directory and HEAD which is the latest commit
git diff --cached // differ HEAD and staging area
git diff --staged // differ HEAD and staging area
添加提交:git commit -m "commit message" // should replace "commit message" whatever you want
修改提交:
git add <forgotten_file> // after commit, then forgeting some files didn't add, or commit information write wrong
git commit --amend
查看log:git log // show some logs
查看log:git log --oneline --decorate --graph --all // show log
取消working directory的修改/改变:git checkout HEAD <file> [...] // discards changes in the working directory
取消staging area的修改/改变:git reset HEAD <file> [...] // unstages file changes in the staging area
git reset SHA // can be used to reset to a previous commit in your commit history
/* In Git, the commit you are currently on is known as the 'HEAD' commit. In many cases, the most recently made commit is the 'HEAD' commit. */
git show HEAD // show the HEAD commmit
git checkout HEAD filename // discards changes in the working dirct
git reset HEAD filename // unstage file changes in the staging area
git reset commit_SHA // reset to a previous commit in your history
Branch
查看分支:git branch
查看更多分支:git branch -a [-r]
创建分支:git branch <branch_name>
切换分支:git checkout <branch_name>
创建+切换分支:git checkout -b <branch_name>
重命名分支:git branch -m <new_branch_name> // in current branch
重命名分支:git branch -m <old_branch_name> <new_branch_name>
合并某分支到当前分支:git merge <branch_name>
修改提交信息:git commit --amend // might enter text editor mode
// even if "master" branch doesn't have all commits from the branch_name
强制删除分支:git branch -D <branch_name> // better check commits
删除分支:git branch -d <branch_name> // try this first before replace '-d' with '-D'
查看上游:git remote -v
添加远程地址:git remote add origin <remote_url> // add the 'origin' remote's URL
修改远程地址:git remote set-url origin <remote_url> // set the 'origin' remote's URL, or you can just edit .git/config and change the URLs there
移除远程地址: git remote rm <remote_name> // delete remote repo reference; e.g. delete origin remote: git remote rm origin, more details check [here](https://help.github.com/articles/removing-a-remote/)
git remote rename <old_name> <new_name> // rename repo
删除远程/上游分支:git remote rm origin <branch_name>
拉取并合并:git pull origin <branch_name>
// check which branch have merged to branch of where i am
git branch --merged
git branch --no-merged
// delete remote branch
git push origin --delete branch_name
// merge remote branch to current local branch
git merge origin/branch
// create new local branch from remote
git checkout -b new_branch origin/branch_name
Git with remote repo
// Creates a local copy of a remote.
git clone <url>
// Lists a Git project's remotes,see more detail.
git remote -v
// but not influence your local code.
git fetch // fetch the latest commit from remote repo, but not influence your local code. if you "git branch -r", you
// Merges origin/master into your local branch, there are two or three model
// 1. Fast forward; 2. Merge made by recursive [3. have conflict]
git merge origin/master
or ['git merge origin/branch_name <local_branch>']
// pulls the latest origin remote to local branch.
// 'git fetch' + 'git merge'
git pull origin <branch_name>
// push 到同名的branch上
git push -u origin master
Tag
为什么需要打Tag,每次commit的时候,对应的message描述的应该是,实现什么功能,修改什么bugs等;有时候我们需要通过打Tag,或者叫打标签的方法,记录下,哪个commit是某个模块/这个项目/这个产品的版本号和相关信息。注:一个项目可能包含多个模块,对吧。打tag不会影响到commit。实际上相当于在某个commit上贴了个标签,详情可以看这个项目
git tag // show all tags
git tag -l 'v1.8.5*' // show specified mode and look for tag, eg, interested in 1.8.5
// create two type tag, lightwight and annotated
// recommand you use annotated tag for GNU Privacy Guard
git tag -a v1.4 -m "my version 1.4"
git tag v1.4-lw // no '-m' and '-a' choice
// show v1.4 information
git show v1.4 // annotated type tag
git show v1.4-lw // lightwight type tag
git log --pretty=oneline
git tag -a v1.2 9fcebo23di[this is a commit sha value] // tag later for some commit
git tag --delete tag_name // delete local tag
git push origin [tagname] // share tag by pushing tag into remote repo
git push origin --tags // push one more tags
# git push remote_name --delete branch_name
git push origin --delete feature/login // delete remote brach
// if you wanna check this tag,
// if you wanna work directory and specified tag of repo
git checkout -b version2 v2.0.0 // based on this tag 'v2.0.0', jump into new branch
Stash
git status // check status
git stash save // stash this status
git status // check status, again
git stash list // show all stash item
git stash apply // back to original state, there are only no commit files, not staged will be auto staged;
// back to original state, there are not staged, files and no commit files; Better use this command;
git stash apply --index
git stash apply stash@{2} --index //specified stash item
git status
git stash drop stash@{number} // remove specified stash item
git stash pop // remove the last stash item
git stash branch new_branch //
Alias
git config --global alias.co checkout
alias.br branch
alias.st status
alias.ci commit
alias.unstage 'reset HEAD --' // unstage
alias.unchange 'checkout --' // unmodified work directory
alias.last 'log -1 HEAD' // the last commit
Create a remote repo from github
echo "# hellotoday" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:shanksiscool/hellotoday.git // ssh mode, your url might be https://www.github.com/shanksiscool/hellotoday.git
git push -u origin master
After modified .gitignore file
git rm -r --cached . // remove everything from the *index*
git rm --cached filename // remove one filename from the *index*
git add . // add all files to staging area
git commit -m ".gitignore is now working" // make a commit
网友评论