Git е система за контрол на версиите (VCS), която улеснява проследяването на промените във файловете. Например, когато редактирате текстов файл, git може да ви помогне да определите какво точно се е променило, кой го е променил и защо. Основно е полезен при координиране с множество програмисти, работещи по едни и същи проекти едновременно. Git предоставя гъвкавост на програмиста да работи по проект независимо, без да засяга работата на другите. Ето един сценарий, Екип от 50 разработчици, работещи по проект едновременно и непрекъснато обновяващи кода. По същото време друг разработчик актуализира същия код със своите промени, което причинява конфликта. Как може да се избегне този конфликт.
Разработчикът може да изреже отделен локален клон и да започне да прави своите промени. След като промените са направени, разработчикът трябва да вземе изтеглянето от клона master, да разреши конфликтите, ако има такива, и да изпрати промените в главния клон на хранилището. След като промените бъдат обединени с основния главен клон, тогава той ще бъде видим и за други разработчици. По-долу са сериите от често използвани команди.
- Създайте празно git хранилище или повторно инициализиране, ако вече съществува.. Това ще създаде .gitдиректория в текущата ви директория, която ще има няколко важни директории и файлове.
ansible[@[:~/ansible$ git init ansible[@[:~/ansible$ cd .git ansible[@[:~/ansible$ ls -lart drwxr-xr-x+ objects drwxr-xr-x+ info drwxr-xr-x+ hooks -rw-r — r — + description -rw-r — r — + config -rw-r — r — + HEAD HEAD: Content of HEAD file refers to different file ref: refs/heads/master . The file contains the hash of the most recent commit on the master branch
- Клониране на хранилище
ansible[@[:~/ansible$ git clone https://github.com/ansible/ansible.git Cloning into ‘ansible’… remote: Counting objects: 306502, done. remote: Compressing objects: 100% (16/16), done. remote: Total 306502 (delta 10), reused 0 (delta 0), pack-reused 306486 Receiving objects: 100% (306502/306502), 109.82 MiB | 2.55 MiB/s, done. Resolving deltas: 100% (194314/194314), done. Checking connectivity… done. ansible[@[:~/ansible$
- Избройте текущия клон
ansible[@[:~/ansible/ansible$ git branch * devel ansible[@[:~/ansible/ansible$
- Избройте всички клонове
ansible[@[:~/ansible/ansible$ git branch -a * devel remotes/origin/HEAD -> origin/devel remotes/origin/devel remotes/origin/release1.5.0 remotes/origin/release1.5.1 remotes/origin/release1.5.2 remotes/origin/release1.5.3 remotes/origin/release1.5.4 remotes/origin/release1.5.5 remotes/origin/release1.6.0 remotes/origin/stable-1.9 remotes/origin/stable-2.0 remotes/origin/stable-2.0-network remotes/origin/stable-2.0.0.1 remotes/origin/stable-2.1 remotes/origin/stable-2.2 remotes/origin/stable-2.3 remotes/origin/temp-staging-post-2.4.4 remotes/origin/threading_instead_of_forking remotes/origin/threading_plus_forking ansible[@[:~/ansible/ansible$
- Плащане на клон. Вижте: Git Checkout
ansible[@[:~/ansible/ansible$ git checkout release1.5.0 Branch release1.5.0 set up to track remote branch release1.5.0 from origin. Switched to a new branch 'release1.5.0' ansible[@[:~/ansible/ansible$ git branch devel * release1.5.0 ansible[@[:~/ansible/ansible$
- Изтеглете най-новите промени (ако има промени в локалното копие, първо разрешете конфликта). За да разрешите конфликтите Вижте: Как да разрешите конфликти в git
ansible[@[:~/ansible/ansible$ git pull remote: Counting objects: 7, done. remote: Total 7 (delta 4), reused 4 (delta 4), pack-reused 2 Unpacking objects: 100% (7/7), done. From https://github.com/ansible/ansible 0a6b951..190755f devel -> origin/devel Already up-to-date. ansible[@[:~/ansible/ansible$
- Създайте клон local_changes, за да започнете вашите промени.
Създадохме локален клон с име local_changes, но указателят все още препраща към release1.5.0. Трябва да проверим клона, преди да започнем работа.
ansible[@[:~/ansible/ansible$ git branch devel local_changes * release1.5.0 ansible[@[:~/ansible/ansible$
- Изтрийте локален клон local_changes(използвайки -d флаг).
ansible[@[:~/ansible/ansible$ git branch -d local_changes Deleted branch local_changes (was 6221a27). ansible[@[:~/ansible/ansible$ git branch devel * release1.5.0 ansible[@[:~/ansible/ansible$
- Създайте и прегледайте клон local_changesдиректно.
ansible[@[:~/ansible/ansible$ git checkout -b local_changes Switched to a new branch 'local_changes' ansible[@[:~/ansible/ansible$ git branch devel * local_changes release1.5.0 ansible[@[:~/ansible/ansible$
- Направете промените в кода и проверете състоянието. Ще ви даде списък с добавени/изтрити/актуализирани файлове.
Създадохме нов файл с име ansible.yml и актуализирахме файла setup.py. В момента и двата файла са непроследени.
ansible[@[:~/ansible/ansible$ git status On branch local_changes 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: setup.py Untracked files: (use "git add <file>..." to include in what will be committed) ansible.yml no changes added to commit (use "git add" and/or "git commit -a") ansible[@[:~/ansible/ansible$
- Вземете разликата и проверете промените с главния клон. Знакът плюс + показва новодобавените редове във файла setup.py.
ansible[@[:~/ansible/ansible$ git diff setup.py diff --git a/setup.py b/setup.py index c537ee9..bfb0462 100644 --- a/setup.py +++ b/setup.py @@ -22,6 +22,24 @@ data_files = [] for i in dirs: data_files.append((os.path.join(install_path, i), glob('./library/' + i + '/*'))) + +print "Adding a test statement"
- Преместете променените файлове в етапа.
Новият файл ansible.ymlе преместен в етапната област и е готов за ангажиране сега.
ansible[@[:~/ansible/ansible$ git add ansible.yml ansible[@[:~/ansible/ansible$ git status On branch local_changes Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: ansible.yml 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: setup.py ansible[@[:~/ansible/ansible$
- Ако искате да преместите промените обратно към премахване на етапа. Използвайки командата по-долу, ние сме на същото място, където бяхме преди git add.
ansible[@[:~/ansible/ansible$ git reset HEAD ansible.yml Unstaged changes after reset: M setup.py ansible[@[:~/ansible/ansible$ git status On branch local_changes 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: setup.py Untracked files: (use "git add <file>..." to include in what will be committed) ansible.yml no changes added to commit (use "git add" and/or "git commit -a") ansible[@[:~/ansible/ansible$
- Ако искате да работите върху друг клон и да го ангажирате в master поради някакъв непосредствен проблем, тогава може да се използва git stash. Stash е много хубава функция, предоставена от git. Вижте страницата, за да разберетеgit Stash.
ansible[@[:~/ansible/ansible$ git stash Saved working directory and index state WIP on local_changes: 6221a27 Updating files for new upstream release 1.5.0 HEAD is now at 6221a27 Updating files for new upstream release 1.5.0 ansible[@[:~/ansible/ansible$ git status On branch local_changes Untracked files: (use "git add <file>..." to include in what will be committed) ansible.yml nothing added to commit but untracked files present (use "git add" to track) ansible[@[:~/ansible/ansible$ git stash list stash@{0}: WIP on local_changes: 6221a27 Updating files for new upstream release 1.5.0
- Извършете промените.
ansible[@[:~/ansible/ansible$ git add setup.py ansible[@[:~/ansible/ansible$ git commit -m 'Added print statement in file setup.py' [local_changes 74139d3] Added print statement in file setup.py 1 file changed, 2 insertions(+) ansible[@[:~/ansible/ansible$ git status On branch local_changes Untracked files: (use "git add <file>..." to include in what will be committed) ansible.yml nothing added to commit but untracked files present (use "git add" to track) ansible[@[:~/ansible/ansible$ Note: We can see ansible.yml is still untracked as we have not added this file for commit.
- До този момент промените са комитирани само в локалния клон local_changes. Промените са налични само в локалната система, което може да се провери чрез проверка на git logs.
Той ще предостави списъка с ангажименти с техния хеш, име на автор и дата
ansible[@[:~/ansible/ansible$ git log commit 74139d323f4c9cbbd5b1f78f0e33017dcd67042f Author: OpenInfo <[email protected]> Date: Sat Mar 17 17:27:26 2018 -0700 Added print statement in file setup.py commit 6221a2740f5c3023c817d13e4a564f301ed3bc73 Author: James Cammarata <[email protected]> Date: Fri Feb 28 14:17:07 2014 -0600 Updating files for new upstream release 1.5.0
- Пуснете промените в дистанционно.
Директен опит за натискане на клона на отдалечено ще се провали поради недостъпност на клона local_changes на отдалечен сайт. Така че трябва изрично да кажем информацията нагоре по веригата.
ansible[@[:~/ansible/ansible$ git push fatal: The current branch local_changes has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin local_changes ansible[@[:~/ansible/ansible$ git push --set-upstream origin local_changes Username for 'https://github.com': OpenInfo Password for 'https://[email protected]':
- Ако сте администратор на хранилище, тогава сте готови или в противен случай отидете на потребителския интерфейс на github и създайте заявка за изтегляне и помолете администратора да се слее в главния клон.